From 1376ad96d41b271555aca3c5b260ea7e480b495c Mon Sep 17 00:00:00 2001 From: vanten-s Date: Sat, 10 Aug 2024 03:49:28 +0200 Subject: [PATCH] Added a simple malloc/free --- Makefile | 1 + include/kernel/heap.h | 19 +++++++++++++ kernel/heap.c | 65 ++++++++++++++++++++++++++++++++++++++++++- kernel/kernel.c | 6 +++- 4 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 include/kernel/heap.h diff --git a/Makefile b/Makefile index 2c06c83..680ec92 100644 --- a/Makefile +++ b/Makefile @@ -24,6 +24,7 @@ kernel/debugging.o \ kernel/elf.o \ kernel/syscall.o \ kernel/keyboard.o \ +kernel/heap.o \ LIB_OBJS=\ $(ARCHDIR)/bootstrap.o \ diff --git a/include/kernel/heap.h b/include/kernel/heap.h new file mode 100644 index 0000000..3a3ae47 --- /dev/null +++ b/include/kernel/heap.h @@ -0,0 +1,19 @@ +#include +#include +#include + +struct Heap_Metadata { + struct Heap_Block* start; + size_t size; +}; + +struct Heap_Block { + struct Heap_Block* next; + size_t size; + bool used; + void* data; +}; + +void heap_init(); +void* malloc(size_t size); +void free(void *ptr); diff --git a/kernel/heap.c b/kernel/heap.c index 6518014..3ec7641 100644 --- a/kernel/heap.c +++ b/kernel/heap.c @@ -1,3 +1,66 @@ #include -uint8_t heap[2000]; +#include +#include + +#define HEAP_SIZE (256 * 4096) + +uint8_t* global_heap_data[HEAP_SIZE]; +struct Heap_Metadata global_heap; + +void heap_init() +{ + global_heap.size = HEAP_SIZE; + global_heap.start = (struct Heap_Block*) global_heap_data; + + struct Heap_Block* start = global_heap.start; + start->size = HEAP_SIZE; + start->used = false; + start->data = start + 1; + start->next = 0; +} + +void* malloc(size_t size) +{ + struct Heap_Block* current = global_heap.start; + + while (true) { + if (current->used || current->size < size) { + current = current->next; + continue; + } + + if (current == 0) { + return 0; + } + + struct Heap_Block* next = current->data + size; + + next->next = current->next; + next->size = current->size - size - sizeof(struct Heap_Block); + next->data = next + 1; + + current->next = next; + current->size = size; + current->used = true; + + return current->data; + } +} + +void free(void *ptr) +{ + struct Heap_Block* current = global_heap.start; + while (current->data != ptr) { current = current->next; } + + struct Heap_Block* start = current; + + current->used = false; + + while (current->used == false) { + current = current->next; + } + start->next = current; + start->size = (uint32_t)start->next - (uint32_t)start->data; +} + diff --git a/kernel/kernel.c b/kernel/kernel.c index 1f9e0d1..ca324a5 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -1,8 +1,10 @@ #include #include -#include #include #include +#include + +#include /* Check if the compiler thinks you are targeting the wrong operating system. */ #if defined(__linux__) @@ -25,5 +27,7 @@ void kernel_main(void) init_pic(); idt_init(); + heap_init(); + run_program(program, sizeof(program)); }