COW-Fork
核心思想
fork() 默认会把父进程的所有物理内存复制一份给子进程。这极其浪费,尤其是 fork 后通常紧接着 exec(exec 会丢弃刚才复制的所有内存)。
实现步骤
- Fork 时:
- 不复制 物理页。
- 父子进程的 PTE 都指向同一个物理页。
- 关键: 将父子双方的 PTE 权限都设为 Read-Only (去除 PTE_W)。
- 标记该 PTE 为 COW 页面 (利用 RSW 保留位)。
- Write 时:
- 进程尝试写,触发 Store Page Fault (15)。
- Handler:
- 发现是 COW 页面引起的故障。
- 分配新物理页 (
kalloc)。 - 将旧页内容拷贝到新页 (
memmove)。 - 修改 PTE:指向新页,开启 PTE_W,清除 COW 标记。
- Retry: 重试写指令,成功。