diff --git a/src/kernel/memory/pmm.c b/src/kernel/memory/pmm.c index e15c4bd..a222e25 100644 --- a/src/kernel/memory/pmm.c +++ b/src/kernel/memory/pmm.c @@ -1,25 +1,28 @@ #include -uint64_t first = 0; +// Virtual addres of next free page +uint64_t next = 0; void pmm_free(uint64_t page) { - page = (uint64_t)P2V(page); - *(uint64_t *)page = first; - first = page; + // Write previous free pointer to freed page + *(uint64_t *)P2V(page) = next; + // And update free pointer + next = (uint64_t)P2V(page); } uint64_t pmm_alloc() { - uint64_t page = first; - first = page?*(uint64_t *)page:0; - page = (uint64_t)(page?V2P(page):0); - return page; + if(!next) return 0; + uint64_t page = next; + // Read new free pointer from allocated page + next = *(uint64_t *)page; + return (uint64_t)V2P(page); } uint64_t pmm_calloc() { uint64_t page = pmm_alloc(); - memset(P2V(page), 0, 0x1000); + memset(P2V(page), 0, PAGE_SIZE); return page; }