练习题:系统调用 xv6,可返回可用的免费内存(MIT6S081, XV-6-Operating system organization)
·
Step 1: 定义系统调用号
文件:kernel/syscall.h
// 在文件末尾添加
#define SYS_getfreemem 22
Step 2: 添加系统调用声明
文件:kernel/syscall.c
// 在 extern 声明区域添加
extern uint64 sys_getfreemem(void);
// 在 syscalls 数组中添加
[SYS_getfreemem] sys_getfreemem,
Step 3: 实现系统调用
文件:kernel/sysproc.c
// 在文件末尾添加这个函数
uint64
sys_getfreemem(void)
{
return getfreemem();
}
Step 4: 在 kalloc.c 中实现内存计数函数
文件:kernel/kalloc.c
在文件末尾添加:
// 在 kalloc.c 中添加这个函数
uint64
getfreemem(void)
{
struct run *r;
uint64 free_pages = 0;
acquire(&kmem.lock);
r = kmem.freelist;
while(r) {
free_pages++;
r = r->next;
}
release(&kmem.lock);
// 返回空闲内存的字节数 (PGSIZE = 4096)
return free_pages * PGSIZE;
}
Step 5: 在 defs.h 中添加函数声明
文件:kernel/defs.h
// 在 kalloc 部分添加(通常在文件末尾附近)
// kalloc.c
void kinit(void);
void freerange(void *, void *);
void * kalloc(void);
void kfree(void *);
uint64 getfreemem(void); // 添加这一行
Step 6: 添加用户空间接口
文件:user/user.h
// 在文件末尾添加
int getfreemem(void);
Step 7: 添加用户空间系统调用包装
文件:user/usys.pl
# 在条目列表末尾添加
entry("getfreemem");
Step 8: 创建测试程序
文件:user/freememtest.c
#include "kernel/types.h"
#include "user/user.h"
int
main(void)
{
int free_mem = getfreemem();
if (free_mem < 0) {
printf("getfreemem failed\n");
exit(1);
}
printf("Free memory: %d bytes (%d pages)\n",
free_mem, free_mem / 4096);
// 测试内存分配
printf("\nAllocating memory...\n");
char *ptr = malloc(1024 * 1024); // 分配1MB
if (ptr) {
printf("Allocated 1MB\n");
int free_after = getfreemem();
printf("Free memory after allocation: %d bytes\n", free_after);
free(ptr);
printf("Freed memory\n");
int free_after_free = getfreemem();
printf("Free memory after free: %d bytes\n", free_after_free);
}
exit(0);
}
Step 9: 更新 Makefile
文件:Makefile
# 在 UPROGS 中添加 freememtest
UPROGS = \
$U/_cat \
$U/_echo \
$U/_forktest \
$U/_grep \
$U/_init \
$U/_kill \
$U/_ln \
$U/_ls \
$U/_mkdir \
$U/_rm \
$U/_sh \
$U/_stressfs \
$U/_usertests \
$U/_grind \
$U/_wc \
$U/_zombie \
$U/_freememtest # 添加这一行
Step 10: 编译和测试
# 清理并重新编译
make clean
make qemu
在 xv6 shell 中运行:
freememtest
完整文件修改总结
需要修改的文件列表:
kernel/syscall.h- 添加系统调用号kernel/syscall.c- 添加系统调用入口kernel/sysproc.c- 实现系统调用函数kernel/kalloc.c- 实现内存统计函数kernel/defs.h- 添加函数声明user/user.h- 添加用户接口user/usys.pl- 添加系统调用包装Makefile- 添加测试程序user/freememtest.c- 新建测试程序
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)