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.
This commit is contained in:
Bananymous 2023-04-14 14:15:26 +03:00
parent 9c0f3dd996
commit 2de64b592d
5 changed files with 17 additions and 50 deletions

View File

@ -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++)

View File

@ -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

View File

@ -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();

View File

@ -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

View File

@ -2,7 +2,6 @@
#include <kernel/CriticalScope.h>
#include <kernel/kprint.h>
#include <kernel/Memory/kmalloc.h>
#include <kernel/multiboot.h>
#include <kernel/Thread.h>
@ -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
{