- 在`kalloc.c`文件中定义一个全局变量`freeMemCnt`,记录空闲页框数; - 在分配和回收内存时维护这个全局变量; - 然后实现系统调用`int freemem(void)`查询这个变量的值; - 实现以下用户命令`free`,打印空闲页框数
时间: 2023-08-06 15:16:17 浏览: 79
1. 在 `kalloc.c` 文件中定义全局变量 `freeMemCnt`:
```c
int freeMemCnt = 0;
```
2. 在分配和回收内存时维护 `freeMemCnt` 变量:
当分配一个页框时,`freeMemCnt` 减 1;当回收一个页框时,`freeMemCnt` 加 1。在函数 `kalloc()` 和 `kfree()` 中分别添加如下代码:
```c
// kalloc()
if ((bp = bfreelist) == 0) {
...
} else {
...
freeMemCnt--;
}
// kfree()
free((char*)a);
freeMemCnt++;
```
3. 实现系统调用 `int freemem(void)` 查询 `freeMemCnt` 变量的值:
在 `syscall.h` 文件中添加系统调用号:
```c
#define SYS_freemem 22
```
在 `syscall.c` 文件中添加系统调用处理函数:
```c
extern int freeMemCnt;
int sys_freemem(void) {
return freeMemCnt;
}
```
在 `syscall.h` 文件中添加函数声明:
```c
int freemem(void);
```
在 `usys.S` 文件中添加系统调用的用户层接口:
```assembly
SYSCALL(freemem)
```
在 `user.h` 文件中添加函数声明:
```c
int freemem(void);
```
在 `syscall.c` 文件中添加系统调用和用户层接口的对应关系:
```c
static int (*syscalls[])(void) = {
...
[SYS_freemem] sys_freemem,
};
int
freemem(void)
{
return syscall(SYS_freemem);
}
```
4. 实现用户命令 `free`,打印空闲页框数:
在 `sh.c` 文件中添加命令处理函数:
```c
int
cmd_free(char *arg)
{
printf("freeMemCnt = %d\n", freemem());
return 0;
}
```
在 `sh.c` 文件中添加命令和函数声明:
```c
static struct cmd commands[] = {
...
{ "free", cmd_free, 0 },
};
int cmd_free(char *arg);
```
保存文件后重新编译操作系统,就可以在用户层使用命令 `free` 查询空闲页框数了。
阅读全文