diff options
Diffstat (limited to 'src/kernel/mem.c')
-rw-r--r-- | src/kernel/mem.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/kernel/mem.c b/src/kernel/mem.c index d002050..b455b25 100644 --- a/src/kernel/mem.c +++ b/src/kernel/mem.c @@ -1,11 +1,20 @@ #include <arch/generic.h> #include <kernel/mem.h> +#include <stdint.h> -extern void *_bss_end; static void *highest_page; -void mem_init() { - highest_page = &_bss_end; +void mem_init(struct kmain_info *info) { + // finds the highest used page, and starts allocating pages above it + extern char _bss_end; + void *highest = &_bss_end; + size_t page_mask = PAGE_SIZE - 1; + + if (highest < info->init.at + info->init.size) + highest = info->init.at + info->init.size; + + // align up to PAGE_SIZE + highest_page = (void*)(((uintptr_t)highest + page_mask) & ~page_mask); } void *page_alloc(size_t pages) { |