From 6a3b3213cffd9d906835a47e61a63d061d5c2ad9 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 14 Apr 2023 14:15:26 +0300 Subject: [PATCH] Kernel: Kmalloc now has its memory statically allocated We don't use the memory map given by bootloader since this automatically maps the memory to a available space. --- kernel/arch/i386/MMU.cpp | 2 ++ kernel/arch/i386/boot.S | 4 +-- kernel/arch/x86_64/MMU.cpp | 4 ++- kernel/arch/x86_64/boot.S | 4 +-- kernel/kernel/Memory/kmalloc.cpp | 53 ++++++-------------------------- 5 files changed, 17 insertions(+), 50 deletions(-) diff --git a/kernel/arch/i386/MMU.cpp b/kernel/arch/i386/MMU.cpp index 2905d0c129..87a409fbbb 100644 --- a/kernel/arch/i386/MMU.cpp +++ b/kernel/arch/i386/MMU.cpp @@ -47,6 +47,8 @@ MMU::MMU() m_highest_paging_struct[i] = (uint64_t)page_directory | Flags::Present; } + // FIXME: We should just identity map until g_kernel_end + // create and identity map first 6 MiB uint64_t* page_directory1 = (uint64_t*)(m_highest_paging_struct[0] & PAGE_MASK); for (uint64_t i = 0; i < 3; i++) diff --git a/kernel/arch/i386/boot.S b/kernel/arch/i386/boot.S index c965326bab..da553e33c9 100644 --- a/kernel/arch/i386/boot.S +++ b/kernel/arch/i386/boot.S @@ -28,9 +28,7 @@ g_boot_stack_bottom: g_boot_stack_top: # 0 MiB -> 1 MiB: bootloader stuff -# 1 MiB -> 2 MiB: kernel -# 2 MiB -> 3 MiB: kmalloc -# 3 MiB -> 4 Mib: kmalloc_fixed +# 1 MiB -> : kernel .align 32 boot_page_directory_pointer_table: .skip 4 * 8 diff --git a/kernel/arch/x86_64/MMU.cpp b/kernel/arch/x86_64/MMU.cpp index 6ed86f36e2..387328f2cd 100644 --- a/kernel/arch/x86_64/MMU.cpp +++ b/kernel/arch/x86_64/MMU.cpp @@ -35,7 +35,9 @@ static uint64_t* allocate_page_aligned_page() MMU::MMU() { - // Identity map from 4 KiB -> 6 MiB + // FIXME: We should just identity map until g_kernel_end + + // Identity map from 0 -> 6 MiB m_highest_paging_struct = allocate_page_aligned_page(); uint64_t* pdpt = allocate_page_aligned_page(); diff --git a/kernel/arch/x86_64/boot.S b/kernel/arch/x86_64/boot.S index 6960ae3e76..25e6f4f8b5 100644 --- a/kernel/arch/x86_64/boot.S +++ b/kernel/arch/x86_64/boot.S @@ -41,9 +41,7 @@ # we will identity map first 4 MiB # 0 MiB -> 1 MiB: bootloader stuff - # 1 MiB -> 4 MiB: kernel - # 4 MiB -> 5 MiB: kmalloc - # 5 MiB -> 6 MiB: kmalloc_fixed + # 1 MiB -> : kernel .align 4096 boot_pml4: .skip 512 * 8 diff --git a/kernel/kernel/Memory/kmalloc.cpp b/kernel/kernel/Memory/kmalloc.cpp index 816d1ba541..c300170675 100644 --- a/kernel/kernel/Memory/kmalloc.cpp +++ b/kernel/kernel/Memory/kmalloc.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include @@ -10,6 +9,8 @@ static constexpr size_t s_kmalloc_min_align = alignof(max_align_t); +static uint8_t s_kmalloc_storage[2 * MB]; + struct kmalloc_node { void set_align(ptrdiff_t align) { m_align = align; } @@ -60,9 +61,9 @@ static_assert(sizeof(kmalloc_node) == s_kmalloc_min_align); struct kmalloc_info { - static constexpr uintptr_t base = 0x00400000; - static constexpr size_t size = 1 * MB; - static constexpr uintptr_t end = base + size; + const uintptr_t base = (uintptr_t)s_kmalloc_storage; + const size_t size = sizeof(s_kmalloc_storage) / 2; + const uintptr_t end = base + size; kmalloc_node* first() { return (kmalloc_node*)base; } kmalloc_node* from_address(void* addr) @@ -91,11 +92,10 @@ struct kmalloc_fixed_info { using node = kmalloc_fixed_node<64>; - static constexpr uintptr_t base = s_kmalloc_info.end; - static constexpr size_t size = 1 * MB; - static constexpr uintptr_t end = base + size; - static constexpr size_t node_count = size / sizeof(node); - static_assert(node_count < (1 << 16)); + const uintptr_t base = s_kmalloc_info.end; + const size_t size = (uintptr_t)s_kmalloc_storage + sizeof(s_kmalloc_storage) - base; + const uintptr_t end = base + size; + const size_t node_count = size / sizeof(node); node* free_list_head = NULL; node* used_list_head = NULL; @@ -108,42 +108,9 @@ struct kmalloc_fixed_info }; static kmalloc_fixed_info s_kmalloc_fixed_info; -extern "C" uintptr_t g_kernel_end; - void kmalloc_initialize() { - if (!(g_multiboot_info->flags & (1 << 6))) - Kernel::panic("Kmalloc: Bootloader didn't provide a memory map"); - - if ((uintptr_t)&g_kernel_end > s_kmalloc_info.base) - Kernel::panic("Kmalloc: Kernel end ({}) is over kmalloc base ({})", &g_kernel_end, (void*)s_kmalloc_info.base); - - // Validate kmalloc memory - bool valid = false; - for (size_t i = 0; i < g_multiboot_info->mmap_length;) - { - multiboot_memory_map_t* mmmt = (multiboot_memory_map_t*)(g_multiboot_info->mmap_addr + i); - - if (mmmt->type == 1) - { - if (mmmt->base_addr <= s_kmalloc_info.base && s_kmalloc_fixed_info.end <= mmmt->base_addr + mmmt->length) - { - valid = true; - break; - } - } - - i += mmmt->size + sizeof(uint32_t); - } - - if (!valid) - { - size_t kmalloc_total_size = s_kmalloc_info.size + s_kmalloc_fixed_info.size; - Kernel::panic("Kmalloc: Could not find {}.{} MB of memory", - kmalloc_total_size / MB, - kmalloc_total_size % MB - ); - } + dprintln("kmalloc {8H}->{8H}", (uintptr_t)s_kmalloc_storage, (uintptr_t)s_kmalloc_storage + sizeof(s_kmalloc_storage)); // initialize fixed size allocations {