练习题:系统调用 xv6,可返回可用的免费内存(MIT6S081, XV-6-Operating system organization)

📅 2026/7/10 16:35:50
练习题:系统调用 xv6,可返回可用的免费内存(MIT6S081, XV-6-Operating system organization)
Step 1: 定义系统调用号文件kernel/syscall.h// 在文件末尾添加 #define SYS_getfreemem 22Step 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- 新建测试程序