diff options
author | Mole Shang <[email protected]> | 2024-02-19 21:51:26 +0800 |
---|---|---|
committer | Mole Shang <[email protected]> | 2024-02-19 22:13:01 +0800 |
commit | 09ba9112386d5d59d7f2a31c469768c582acb939 (patch) | |
tree | b1dce737cdd94164e8d7f3f651ea7a86a22a42f3 /kernel/vm.c | |
parent | d86118fc80267649b4791c8c0c72ebd60edf1ef2 (diff) | |
download | xv6-labs-09ba9112386d5d59d7f2a31c469768c582acb939.tar.gz xv6-labs-09ba9112386d5d59d7f2a31c469768c582acb939.tar.bz2 xv6-labs-09ba9112386d5d59d7f2a31c469768c582acb939.zip |
lab mmap: finish
Diffstat (limited to 'kernel/vm.c')
-rw-r--r-- | kernel/vm.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/kernel/vm.c b/kernel/vm.c index be7d042..08859ae 100644 --- a/kernel/vm.c +++ b/kernel/vm.c @@ -182,6 +182,7 @@ uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free) { uint64 a; pte_t *pte; + int cow_pg = 0; if((va % PGSIZE) != 0) panic("uvmunmap: not aligned"); @@ -192,10 +193,11 @@ uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free) if((*pte & PTE_V) == 0) { printf("va=%p pte=%p\n", a, *pte); panic("uvmunmap: not mapped"); + cow_pg = 1; } if(PTE_FLAGS(*pte) == PTE_V) panic("uvmunmap: not a leaf"); - if(do_free){ + if(do_free && !cow_pg){ uint64 pa = PTE2PA(*pte); kfree((void*)pa); } @@ -315,14 +317,14 @@ uvmfree(pagetable_t pagetable, uint64 sz) // returns 0 on success, -1 on failure. // frees any allocated pages on failure. int -uvmcopy(pagetable_t old, pagetable_t new, uint64 sz) +uvmcopy(pagetable_t old, pagetable_t new, uint64 start, uint64 sz) { pte_t *pte; uint64 pa, i; uint flags; // char *mem; - for(i = 0; i < sz; i += PGSIZE){ + for(i = start; i < start+sz; i += PGSIZE){ if((pte = walk(old, i, 0)) == 0) panic("uvmcopy: pte should exist"); if((*pte & PTE_V) == 0) |