diff options
author | dzwdz | 2021-07-17 19:58:02 +0200 |
---|---|---|
committer | dzwdz | 2021-07-17 19:58:02 +0200 |
commit | 6200bd2d95ad6ff9a65f8b97b9335353e3a52c5e (patch) | |
tree | a4d0d718f42e918f9dafc6b01e66e436cb3db713 /src/kernel/mem.c | |
parent | f66140abab48d3c3c7910d1842b1daf3571d73ad (diff) |
detect the highest used memory address, and only allocate pages above it
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) { |