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

完整文件修改总结

需要修改的文件列表:

  1. kernel/syscall.h - 添加系统调用号
  2. kernel/syscall.c - 添加系统调用入口
  3. kernel/sysproc.c - 实现系统调用函数
  4. kernel/kalloc.c - 实现内存统计函数
  5. kernel/defs.h - 添加函数声明
  6. user/user.h - 添加用户接口
  7. user/usys.pl - 添加系统调用包装
  8. Makefile - 添加测试程序
  9. user/freememtest.c - 新建测试程序
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐