From cd2c4e4a25cb41ca6fe622f0ccf1b1a3dd9d5660 Mon Sep 17 00:00:00 2001 From: Carlos Maiolino Date: Sun, 14 Sep 2025 14:18:41 +0200 Subject: Add a kernel heap Use the heap API to implement a 100MiB heap to be used by the kernel code. Add example usage to src/kernel.c Signed-off-by: Carlos Maiolino --- src/include/mm/kernel_heap.h | 20 ++++++++++++++++++++ src/kernel.c | 15 +++++++++++++++ src/mm/kernel_heap.c | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 src/include/mm/kernel_heap.h create mode 100644 src/mm/kernel_heap.c diff --git a/src/include/mm/kernel_heap.h b/src/include/mm/kernel_heap.h new file mode 100644 index 0000000..4527a11 --- /dev/null +++ b/src/include/mm/kernel_heap.h @@ -0,0 +1,20 @@ +#ifndef KERNEL_HEAP_H +#define KERNEL_HEAP_H + +#include + +#define KERNEL_HEAP_SIZE_BYTES (1024 * 1024 * 100) /* 100 MiB */ +#define KERNEL_HEAP_ENTRIES (KERNEL_HEAP_SIZE_BYTES / PAGE_SIZE) + +/* Addresses taken from OSDev x86 memory map */ +#define KERNEL_HEAP_ADDR (0x01000000) + +/* This should give us 480.5 kiB, enough for the current table size */ +#define KERNEL_HEAP_TBL_ADDR (0x00007E00) + + +void kernel_heap_init(); +void * kmalloc(size_t size); +void kfree(void *ptr); + +#endif /* KERNEL_HEAP_H */ diff --git a/src/kernel.c b/src/kernel.c index 8a8bd61..cd9f9d7 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -5,6 +5,7 @@ #include #include #include +#include void start_kernel() { @@ -12,6 +13,20 @@ void start_kernel() vprintl("Hello World!!!\n"); vprintl("Testing it!!!\n"); + kernel_heap_init(); interrupts_init(); + + void *ptr = kmalloc(50); + void *ptr2 = kmalloc(5000); + void *ptr3 = kmalloc(5600); + + *((int *)ptr) = 11; + kfree(ptr); + void *ptr4 = kmalloc(50); + + *((int *)ptr2) = 22; + *((int *)ptr3) = 33; + *((int *)ptr4) = 44; + if (ptr || ptr2 || ptr3 || ptr4) {} } diff --git a/src/mm/kernel_heap.c b/src/mm/kernel_heap.c new file mode 100644 index 0000000..e53057c --- /dev/null +++ b/src/mm/kernel_heap.c @@ -0,0 +1,35 @@ +#include +#include +#include +#include + +struct heap kernel_heap; + +struct heap_table kernel_heap_table; + +void +kernel_heap_init() +{ + int ret; + void *end = (void *)(KERNEL_HEAP_ADDR + KERNEL_HEAP_SIZE_BYTES); + + kernel_heap_table.entries = (unsigned char *)KERNEL_HEAP_TBL_ADDR; + kernel_heap_table.count = KERNEL_HEAP_ENTRIES; + + ret = heap_create(&kernel_heap, + (void *)KERNEL_HEAP_ADDR, + end, + &kernel_heap_table); + + if (ret < 0) + vprintl("Failed to create kernel's heap\n"); +} + +void * kmalloc(size_t size) +{ + return heap_malloc(&kernel_heap, size); +} + +void kfree(void *ptr) { + heap_free(&kernel_heap, ptr); +} -- cgit v1.2.3