From b500a8a7edb3e9a94191d83a1927f634fdc18ad8 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Wed, 16 Nov 2022 19:48:36 +0200 Subject: [PATCH] kmalloc --- kernel/Makefile | 1 + kernel/include/kernel/kmalloc.h | 12 ++++++ kernel/kernel/kmalloc.cpp | 67 +++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 kernel/include/kernel/kmalloc.h create mode 100644 kernel/kernel/kmalloc.cpp diff --git a/kernel/Makefile b/kernel/Makefile index 1c28f559..e25ef61e 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -30,6 +30,7 @@ LIBS:=$(LIBS) $(KERNEL_ARCH_LIBS) KERNEL_OBJS=\ $(KERNEL_ARCH_OBJS) \ kernel/kernel.o \ +kernel/kmalloc.o \ kernel/SSP.o \ OBJS=\ diff --git a/kernel/include/kernel/kmalloc.h b/kernel/include/kernel/kmalloc.h new file mode 100644 index 00000000..4ea1c0d5 --- /dev/null +++ b/kernel/include/kernel/kmalloc.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +void kmalloc_initialize(); + +void* kmalloc(size_t); +void kfree(void*); + + +inline void* operator new(size_t size) { return kmalloc(size); } +inline void* operator new[](size_t size) { return kmalloc(size); } diff --git a/kernel/kernel/kmalloc.cpp b/kernel/kernel/kmalloc.cpp new file mode 100644 index 00000000..08d4c9ba --- /dev/null +++ b/kernel/kernel/kmalloc.cpp @@ -0,0 +1,67 @@ +#include +#include +#include +#include + +#include +#include + +#define MB (1 << 20) + +struct kmalloc_info_t +{ + static constexpr size_t total_size = 1 * MB; + void* base_addr = (void*)0x00200000; + size_t used; +}; +static kmalloc_info_t s_kmalloc_info; + +void kmalloc_initialize() +{ + if (!(s_multiboot_info->flags & (1 << 6))) + Kernel::panic("Bootloader didn't give a memory map"); + + bool valid = false; + for (size_t i = 0; i < s_multiboot_info->mmap_length;) + { + multiboot_memory_map_t* mmmt = (multiboot_memory_map_t*)(s_multiboot_info->mmap_addr + i); + + if (mmmt->type == 1) + { + char* ptr1 = (char*)mmmt->base_addr; + char* ptr2 = (char*)s_kmalloc_info.base_addr; + size_t len1 = mmmt->length; + size_t len2 = s_kmalloc_info.total_size; + + if (ptr1 <= ptr2 && ptr1 + len1 >= ptr2 + len2) + { + valid = true; + break; + } + } + + i += mmmt->size + sizeof(uint32_t); + } + + if (!valid) + Kernel::panic("Could not find enough space for kmalloc"); + + memset(s_kmalloc_info.base_addr, 0, s_kmalloc_info.total_size); + + s_kmalloc_info.used = 0; +} + +void* kmalloc(size_t size) +{ + if (s_kmalloc_info.total_size - s_kmalloc_info.used < size) + Kernel::panic("Out of kernel memory"); + + char* result = (char*)s_kmalloc_info.base_addr + s_kmalloc_info.used; + s_kmalloc_info.used += size; + return (void*)result; +} + +void kfree(void*) +{ + +}