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 33 34 35 36 37 38 39 40 41 42 43
| uint64 sys_munmap() { printf("sys_munmap\n"); uint64 addr; int length; int cnt = 0; if (argaddr(0, &addr) < 0 || argint(1, &length) < 0) return -1; struct proc *p = myproc(); struct vma *v; for (int i = 0; i < NVMA; i++) { v = &p->vma_list[i]; if (v->used == 0) continue; if (addr >= v->addr && addr < v->addr + v->length) { printf("addr:%p, length:%x\nv->addr:%p, v->length:%x, v->addr + v->length:%x\n", addr, length, v->addr, v->length, v->addr + v->length); if (length >= v->length) { length = v->length; } v->addr = v->addr + length; v->length = v->length - length; if ((v->prot & PROT_WRITE) && (v->flag & MAP_SHARED)) { filewrite(v->file, addr, length); } uvmunmap(p->pagetable, addr, length / PGSIZE, 1); if (v->length == 0) { fileclose(v->file); v->used = 0; } break; } cnt += 1; } if (cnt == NVMA) return -1; return 0; }
|