COW-Fork

核心思想

fork() 默认会把父进程的所有物理内存复制一份给子进程。这极其浪费,尤其是 fork 后通常紧接着 exec(exec 会丢弃刚才复制的所有内存)。

实现步骤

  1. Fork 时:
    • 不复制 物理页。
    • 父子进程的 PTE 都指向同一个物理页
    • 关键: 将父子双方的 PTE 权限都设为 Read-Only (去除 PTE_W)
    • 标记该 PTE 为 COW 页面 (利用 RSW 保留位)。
  2. Write 时:
    • 进程尝试写,触发 Store Page Fault (15)。
  3. Handler:
    • 发现是 COW 页面引起的故障。
    • 分配新物理页 (kalloc)。
    • 将旧页内容拷贝到新页 (memmove)。
    • 修改 PTE:指向新页,开启 PTE_W,清除 COW 标记。
  4. Retry: 重试写指令,成功。