梳理做这个lab需要做的事情
1.修改 uvmcopy()函数 只是让子进程的pte映射到父进程的物理页面上 而不是分配页面
而且要把进程的pte上的PTE_W 取消
2.修改usertrap() 让它识别page fault 就是想写入一个未设置 PTE_W 的页面
用kalloc()分配页面 并把旧页面复制过来 为新页面对应PTE设置PTE_W
3.为pages添加引用计数 可以用数组保存 用页面的物理地址除以 4096 作为数组的索引
给这个数字 a number of element 大小等于kinit() 放在空闲列表中的任何页面的最高物理地址
4.修改 copyout() 在遇到 COW 页面时使用与页面故障相同的方案
那么如何断定一个页面是 COW的 要用到pte中预留的位来标识
5.在 kernel/riscv.h 的末尾有一些有用的宏和页表标志定义
6.如果触发了COW page fault 当没有可用内存时 应该杀死进程
关于引用计数 内核必须要能够识别这是一个copy-on-write场景 (当发生page fault时)
在kalloc()分配页面的时候就把引用计数加1 kree()会在引用计数为0时才释放页面
关于usertrap() 注意与lazy allocation 不同 我们得到r_stval()中的 va进而得到的pte是访问了不能写的页面触发的page fault