Implement copy-on write(hard)
- 从下图可见,xv6的pte中RSW都是可以被软件使用的未定义位,此处将pte中的第9位标记为PTE_COW位。
修改kernel/riscv.h:
- 修改kernel/vm.c,新增refCount代表物理页面的引用次数,根据(PHYSTOP-KERNBASE)/ PGSIZE得32768:
- 修改kernel/vm.c中的uvmcopy():
- 修改kernel/vm.c中的mmappages(),当页表绑定物理页面时增加引用计数:
- 修改kernel/vm.c中的uvmunmap()函数,在页表与物理页解绑时减少对应的引用计数,当refCount为1时释放内存:
- 修改kernel/defs.h,新增walk的声明:
- 修改kernel/trap.c中的usertrap()函数,在发生page fault的时候,如果该虚拟地址关联的pte是COW页,则重新申请一个物理页,将此虚拟内存指向新物理页并修改计数:
注:这里条件设置成refCount==2是因为kernel_pagetable引用过一次,而等于2说明只有个用户页表的映射。 - 修改kernel/vm.c中的copyout函数:
测试结果如下所示:
cowtest:
usertests测试结果: