From a078a11dde75a91d02d69b16973772d2cb0385c7 Mon Sep 17 00:00:00 2001 From: apio Date: Sun, 25 Sep 2022 17:38:17 +0200 Subject: [PATCH] Move PMM and VMM initialization into MemoryManager::init --- kernel/include/memory/MemoryManager.h | 2 ++ kernel/src/init/Init.cpp | 3 +-- kernel/src/memory/MemoryManager.cpp | 21 ++++++++++++++------- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/kernel/include/memory/MemoryManager.h b/kernel/include/memory/MemoryManager.h index c16ac43f..bc74e762 100644 --- a/kernel/include/memory/MemoryManager.h +++ b/kernel/include/memory/MemoryManager.h @@ -7,6 +7,8 @@ namespace MemoryManager { + void init(); + void* get_mapping(void* physicalAddress, int flags = MAP_READ_WRITE); void release_mapping(void* mapping); diff --git a/kernel/src/init/Init.cpp b/kernel/src/init/Init.cpp index c5dd9052..51b39305 100644 --- a/kernel/src/init/Init.cpp +++ b/kernel/src/init/Init.cpp @@ -40,8 +40,7 @@ void Init::early_init() framebuffer0.init((void*)bootboot.fb_ptr, bootboot.fb_type, bootboot.fb_scanline, bootboot.fb_width, bootboot.fb_height); - PMM::init(); - kernelVMM.init(); + MemoryManager::init(); InitRD::init(); diff --git a/kernel/src/memory/MemoryManager.cpp b/kernel/src/memory/MemoryManager.cpp index cecffc27..97cb2eed 100644 --- a/kernel/src/memory/MemoryManager.cpp +++ b/kernel/src/memory/MemoryManager.cpp @@ -9,6 +9,12 @@ #include "memory/PMM.h" #include "memory/VMM.h" +void MemoryManager::init() +{ + PMM::init(); + kernelVMM.init(); +} + void* MemoryManager::get_mapping(void* physicalAddress, int flags) { uint64_t virtualAddress = KernelHeap::request_virtual_page(); @@ -40,6 +46,8 @@ void* MemoryManager::get_unaligned_mapping(void* physicalAddress, int flags) void* MemoryManager::get_unaligned_mappings(void* physicalAddress, uint64_t count, int flags) { + if (!count) return 0; + if (count == 1) return get_unaligned_mapping(physicalAddress, flags); uint64_t offset = (uint64_t)physicalAddress % 4096; uint64_t virtualAddress = KernelHeap::request_virtual_pages(count); if (!virtualAddress) @@ -67,13 +75,8 @@ void MemoryManager::release_unaligned_mapping(void* mapping) void MemoryManager::release_unaligned_mappings(void* mapping, uint64_t count) { - if (!count) - { -#ifdef MM_DEBUG - kwarnln("weird... got asked to free 0 pages of virtual memory"); -#endif - return; - } + if (!count) return; + if (count == 1) return release_unaligned_mapping(mapping); uint64_t offset = (uint64_t)mapping % 4096; KernelHeap::free_virtual_pages((uint64_t)mapping - offset, count); for (uint64_t i = 0; i < count; i++) { kernelVMM.unmap(((uint64_t)mapping - offset) + (i * 4096)); } @@ -117,6 +120,8 @@ void MemoryManager::release_page(void* page) void* MemoryManager::get_pages(uint64_t count, int flags) { + if (!count) return 0; + if (count == 1) return get_page(flags); #ifdef MM_DEBUG kdbgln("allocating several pages (%ld)", count); #endif @@ -152,6 +157,8 @@ void* MemoryManager::get_pages(uint64_t count, int flags) void MemoryManager::release_pages(void* pages, uint64_t count) { + if (!count) return; + if (count == 1) return release_page(pages); #ifdef MM_DEBUG kdbgln("releasing several pages (%ld)", count); #endif