summaryrefslogtreecommitdiff
path: root/src/kernel/mem.c
diff options
context:
space:
mode:
authordzwdz2021-07-17 19:58:02 +0200
committerdzwdz2021-07-17 19:58:02 +0200
commit6200bd2d95ad6ff9a65f8b97b9335353e3a52c5e (patch)
treea4d0d718f42e918f9dafc6b01e66e436cb3db713 /src/kernel/mem.c
parentf66140abab48d3c3c7910d1842b1daf3571d73ad (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.c15
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) {