diff options
author | Robert Morris <[email protected]> | 2010-08-31 12:54:47 -0400 |
---|---|---|
committer | Robert Morris <[email protected]> | 2010-08-31 12:54:47 -0400 |
commit | 7d7dc9331bf33f77c9c3a71350782dadae8dd371 (patch) | |
tree | 4c9d10f56fe4f69b97820ef94db93f30acda6e65 /vm.c | |
parent | 81b30b14d6925a0f5c9eb114724457d90869949c (diff) | |
download | xv6-labs-7d7dc9331bf33f77c9c3a71350782dadae8dd371.tar.gz xv6-labs-7d7dc9331bf33f77c9c3a71350782dadae8dd371.tar.bz2 xv6-labs-7d7dc9331bf33f77c9c3a71350782dadae8dd371.zip |
kalloc/kfree now only a page at a time
do not keep sorted contiguous free list
Diffstat (limited to 'vm.c')
-rw-r--r-- | vm.c | 17 |
1 files changed, 8 insertions, 9 deletions
@@ -29,7 +29,6 @@ // (both in physical memory and in the kernel's virtual address // space). -#define PHYSTOP 0x1000000 #define USERTOP 0xA0000 static uint kerntext; // Linker starts kernel at 1MB @@ -53,7 +52,7 @@ walkpgdir(pde_t *pgdir, const void *va, int create) pde = &pgdir[PDX(va)]; if (*pde & PTE_P) { pgtab = (pte_t*) PTE_ADDR(*pde); - } else if (!create || !(r = (uint) kalloc(PGSIZE))) + } else if (!create || !(r = (uint) kalloc())) return 0; else { pgtab = (pte_t*) r; @@ -156,7 +155,7 @@ setupkvm(void) pde_t *pgdir; // Allocate page directory - if (!(pgdir = (pde_t *) kalloc(PGSIZE))) + if (!(pgdir = (pde_t *) kalloc())) return 0; memset(pgdir, 0, PGSIZE); // Map IO space from 640K to 1Mbyte @@ -206,7 +205,7 @@ allocuvm(pde_t *pgdir, char *addr, uint sz) for(a = first; a <= last; a += PGSIZE){ pte_t *pte = walkpgdir(pgdir, a, 0); if(pte == 0 || (*pte & PTE_P) == 0){ - char *mem = kalloc(PGSIZE); + char *mem = kalloc(); if(mem == 0){ // XXX clean up? return 0; @@ -235,7 +234,7 @@ deallocuvm(pde_t *pgdir, char *addr, uint sz) uint pa = PTE_ADDR(*pte); if(pa == 0) panic("deallocuvm"); - kfree((void *) pa, PGSIZE); + kfree((void *) pa); *pte = 0; } } @@ -260,15 +259,15 @@ freevm(pde_t *pgdir) uint pa = PTE_ADDR(pgtab[j]); uint va = PGADDR(i, j, 0); if (va < USERTOP) // user memory - kfree((void *) pa, PGSIZE); + kfree((void *) pa); pgtab[j] = 0; } } - kfree((void *) da, PGSIZE); + kfree((void *) da); pgdir[i] = 0; } } - kfree((void *) pgdir, PGSIZE); + kfree((void *) pgdir); } int @@ -324,7 +323,7 @@ copyuvm(pde_t *pgdir, uint sz) panic("copyuvm: pte should exist\n"); if(*pte & PTE_P){ pa = PTE_ADDR(*pte); - if (!(mem = kalloc(PGSIZE))) + if (!(mem = kalloc())) return 0; memmove(mem, (char *)pa, PGSIZE); if (!mappages(d, (void *)i, PGSIZE, PADDR(mem), PTE_W|PTE_U)) |