Reference-Counting

在 COW 机制下,一个物理页可能被多个进程(父进程、子进程、孙进程)共享。 当其中一个进程退出或修改页面时,我们不能直接 kfree 物理页,因为别人还在用。

解决方案:引用计数数组

  • 结构: 定义一个全局数组 int ref_count[PHYSTOP / PGSIZE]
  • 规则:
    • kalloc(): 计数置 1。
    • fork() (共享页面): 计数 +1。
    • kfree() / Handler (分离页面): 计数 -1。
  • 释放: 只有当计数减为 0 时,才真正调用物理内存管理器的释放函数。

Lab 6 难点: 你需要修改 kernel/kalloc.c,在所有涉及物理页分配和释放的地方,正确维护这个计数器。还要注意并发锁(Spinlock)的问题。