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