From 2026a4f95f3a7dcc9613c8abe2d79d8284b8cd37 Mon Sep 17 00:00:00 2001 From: Anton Kling Date: Wed, 8 Nov 2023 18:10:56 +0100 Subject: Kernel/MMU: Detect system memory and dynamically adjust memory usage available Previously this would be hardcoded but now it can be detected by the bootloader and passed in via the multiboot header. --- kernel/includes/mmu.h | 5 +++-- kernel/init/kernel.c | 12 ++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/kernel/includes/mmu.h b/kernel/includes/mmu.h index 1df337d..f3af5e4 100644 --- a/kernel/includes/mmu.h +++ b/kernel/includes/mmu.h @@ -31,7 +31,8 @@ typedef struct PageDirectory { uint32_t physical_address; } PageDirectory; -int mmu_allocate_region(void *ptr, size_t n, mmu_flags flags, PageDirectory *pd); +int mmu_allocate_region(void *ptr, size_t n, mmu_flags flags, + PageDirectory *pd); void mmu_allocate_shared_kernel_region(void *rc, size_t n); void *mmu_find_unallocated_virtual_range(void *addr, size_t length); void mmu_remove_virtual_physical_address_mapping(void *ptr, size_t length); @@ -45,7 +46,7 @@ void mmu_map_physical(void *dst, PageDirectory *d, void *physical, void mmu_free_pages(void *a, uint32_t n); void flush_tlb(void); -void paging_init(void); +void paging_init(uint64_t memsize); PageDirectory *get_active_pagedirectory(void); void move_stack(uint32_t new_stack_address, uint32_t size); void switch_page_directory(PageDirectory *directory); diff --git a/kernel/init/kernel.c b/kernel/init/kernel.c index 8c0f70c..9fe7ac4 100644 --- a/kernel/init/kernel.c +++ b/kernel/init/kernel.c @@ -39,17 +39,21 @@ uintptr_t data_end; void kernel_main(uint32_t kernel_end, unsigned long magic, unsigned long addr, uint32_t inital_stack) { - data_end = kernel_end; + (void)kernel_end; + data_end = 0xc0400000; inital_esp = inital_stack; asm("cli"); kprintf("If you see this then the serial driver works :D.\n"); assert(magic == MULTIBOOT_BOOTLOADER_MAGIC); - paging_init(); + multiboot_info_t *mb = (multiboot_info_t *)(addr + 0xc0000000); + uint32_t mem_kb = mb->mem_lower; + uint32_t mem_mb = (mb->mem_upper - 1000) / 1000; + uint64_t memsize_kb = mem_mb * 1000 + mem_kb; + paging_init(memsize_kb); klog("Paging Initalized", LOG_SUCCESS); - multiboot_info_t *mb = - mmu_map_frames((multiboot_info_t *)addr, sizeof(multiboot_info_t)); + mb = mmu_map_frames((multiboot_info_t *)addr, sizeof(multiboot_info_t)); gdt_init(); klog("GDT Initalized", LOG_SUCCESS); -- cgit v1.2.3