From 3efbcf24f4e7f5a0c84bce563d9af645d5134e19 Mon Sep 17 00:00:00 2001 From: Liam Kerr Date: Mon, 9 Feb 2026 00:13:00 +0000 Subject: [PATCH] page allocation --- linker.ld | 3 +++ src/kernel/kernel.c | 9 +++++++++ src/kernel/memory.c | 29 ++++++++++++++++++++++++++--- src/kernel/memory.h | 1 + src/kernel/panic.c | 1 + 5 files changed, 40 insertions(+), 3 deletions(-) diff --git a/linker.ld b/linker.ld index 98a4528..f33640c 100644 --- a/linker.ld +++ b/linker.ld @@ -30,4 +30,7 @@ SECTIONS PROVIDE(_stack_bottom = .); . += 4096; PROVIDE(stack_top = .); + + . = ALIGN(4K); + _heap_start =.; } diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index f9b4f56..5765f87 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -10,5 +10,14 @@ void kmain() { kputs("-------------------"); knewline(); page_init(); + + kprint("Stress testing memory...\n"); + while(1) { + void *p = page_alloc(); + if (p == NULL) { + kpanic("Expected OOM reached!"); + } + } + poweroff(); } diff --git a/src/kernel/memory.c b/src/kernel/memory.c index e28f57b..aaedabb 100644 --- a/src/kernel/memory.c +++ b/src/kernel/memory.c @@ -2,6 +2,7 @@ #include #include "drivers/uart.h" #include "memory.h" +#include "panic.h" #define PAGE_SIZE 4096 @@ -9,13 +10,19 @@ struct Page { struct Page *next; }; -static struct Page *free_list; +struct HeapHeader { + size_t size; + int is_free; + struct HeapHeader *next; +}; -extern uint8_t _bss_end[]; // named in the linker script +static struct Page *free_list = NULL; + +extern uint8_t _heap_start[]; // named in the linker script void page_init() { kprint("Initialising page allocator.\n"); - uintptr_t start = ((uintptr_t)_bss_end + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); + uintptr_t start = ((uintptr_t)_heap_start + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); uintptr_t end = 0x88000000; // Default QEMU RAM limit for (uintptr_t addr = start; addr + PAGE_SIZE <= end; addr += PAGE_SIZE) { @@ -30,4 +37,20 @@ void page_free(void *addr) { p->next = free_list; free_list = p; +} + +void *page_alloc() { { + if (free_list == NULL) { + kpanic("No free pages!"); + } + struct Page *p = free_list; + free_list = free_list->next; + + //zero out the page + for (int i = 0; i < (PAGE_SIZE/8); i++) { + ((uint8_t *)p)[i] = 0; + } + + return (void *)p; +} } \ No newline at end of file diff --git a/src/kernel/memory.h b/src/kernel/memory.h index 943bbe9..dcee87b 100644 --- a/src/kernel/memory.h +++ b/src/kernel/memory.h @@ -3,5 +3,6 @@ void page_init(); void page_free(void *addr); +void *page_alloc(); #endif diff --git a/src/kernel/panic.c b/src/kernel/panic.c index fe203c4..5c60da0 100644 --- a/src/kernel/panic.c +++ b/src/kernel/panic.c @@ -4,6 +4,7 @@ #include void kpanic(const char *reason){ + kprint("\n!!! PANIC!!!\n"); kprint(reason); poweroff(); }