Lab 6
Lab 6 : Copy-on-Write Fork for xv6
Hint1:
// riscv.h:
// 可以使用RISC-V PTE中的RSW(reserved for software,即为软件保留的)位来实现判断一个页面是否是cow页面。
#define PTE_COW (1L << 5)
// vm.c
int
uvmcopy(pagetable_t old, pagetable_t new, uint64 sz)
{
pte_t *pte;
uint64 pa, i;
uint flags;
// char *mem;
for(i = 0; i < sz; i += PGSIZE){
if((pte = walk(old, i, 0)) == 0)
panic("uvmcopy: pte should exist");
if((*pte & PTE_V) == 0)
panic("uvmcopy: page not present");
pa = PTE2PA(*pte);
// 如果页面可写,那么cow页面就需要首先置为只读
flags = PTE_FLAGS(*pte);
if (flags & PTE_W) {
flags = (flags | PTE_COW) & ~PTE_W;
*pte = (*pte | PTE_COW) & ~PTE_W;
}
// if((mem = kalloc()) == 0)
// goto err;
// memmove(mem, (char*)pa, PGSIZE);
if(mappages(new, i, PGSIZE, pa, flags) != 0){
goto err;
}
// 增加页面引用,具体看下面
cowaddrefc((char*)pa);
}
return 0;
err:
uvmunmap(new, 0, i / PGSIZE, 1);
return -1;
}Hint3
Hint2
Hint4
封装的函数
Last updated