1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| int uvmcopy_u(pagetable_t old, pagetable_t new, uint64 sz) { pte_t *pte; uint64 pa, i; int flags;
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 *pte = (*pte & ~PTE_W) | COW_FLAG; flags = PTE_FLAGS(*pte);
if(mappages(new, i, PGSIZE, (uint64)pa, flags) != 0){ goto err; } con[getrefindex((uint64*)pa)]++;
} return 0;
err: uvmunmap(new, 0, i / PGSIZE, 1); return -1; }
|