Skip to content

Lab COW

Implement copy-on write(hard)

  1. 根据题目要求推荐步骤,修改 uvmcopy()uvmcopy()fork() 中复制父进程内存给子进程的函数。看懂 uvmcopy() 函数,它是创建一个新的页表,然后复制一份。然后根据题目要求,不要分配物理内存,因此不需要使用 kalloc() ,但是还是需要创建子进程的页表,因此需要修改 mappages() ,同时还需要修改标志位,将 W 位取消。
  2. 修改 usertrap() ,需要识别缺页异常,在课程中讲了, scause register 会保存触发异常的信息,课程中,就知道应该使用 15 进行判断。抄一下老师上课写在 usertrap() 中的代码,这段代码做的事情就是获取到 page fault ,然后创建一个新的物理内存并且映射,还需要做的事情是将旧的 PTE 复制过去,设置好标志位,用于校验。
  3. kalloc.c 中,添加一个大小是 PHYSTOP >> PGSHIFTint 数组,其实就是总内存大小除以 4096 ,然后在 kfree kalloc 中使用这个数组,同时需要添加两个对外开放的函数,一个增加,减少可以放到 kfree() 中,还要注意上锁。当 fork() 的子进程对应的物理内存引用为 0 时,需要释放。