From af3a28aa9087d291e146884644937a2a913e615c Mon Sep 17 00:00:00 2001 From: Eggert Jung Date: Sat, 10 Jan 2026 22:29:28 +0100 Subject: [PATCH] add bitmap --- kernel/memory/pageframealloc.cc | 28 ++++++++++++++++++++++++---- kernel/memory/pageframealloc.h | 2 ++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/kernel/memory/pageframealloc.cc b/kernel/memory/pageframealloc.cc index 82c87d0..9b38975 100644 --- a/kernel/memory/pageframealloc.cc +++ b/kernel/memory/pageframealloc.cc @@ -5,16 +5,36 @@ #include "../memory/config.h" +uint8_t PageFrameAllocator::bitmap[4294967296 / 4096 / 8]; void PageFrameAllocator::init(){ - Multiboot::Memory* memory_map_start = Multiboot::getMemoryMap(); + Multiboot::Memory* memory_map_entry = Multiboot::getMemoryMap(); dout << "kernel start: " << ___KERNEL_START___; dout << " kernel end: " << ___KERNEL_END___ << endl; - while(memory_map_start != 0){ - dout << "Memory: " << hex << memory_map_start->getStartAddress() << " to " << memory_map_start->getEndAddress() << " is available: " << memory_map_start->isAvailable() << ".\n"; - memory_map_start = memory_map_start->getNext(); + while(memory_map_entry != 0){ + void* start = memory_map_entry->getStartAddress(); + void* end = memory_map_entry->getEndAddress(); + bool available = memory_map_entry->isAvailable(); + dout << "Memory: " << hex << start << " to " << end << " is available: " << available << "." << endl; + + //TODO priotity for conflicting regions + for(uint64_t i = (uint64_t)start; i < (uint64_t)end; i += 4096){ + uint64_t pg = i/4096; + if(available) + bitmap[pg/8] |= 1 << pg%8; + else + bitmap[pg/8] &= ~(1 << pg%8); + } + + memory_map_entry = memory_map_entry->getNext(); } + + for(uint64_t i = (uint64_t)&___KERNEL_START___; i < (uint64_t)&___KERNEL_END___; i += 4096){ + uint64_t pg = i/4096; + bitmap[pg/8] &= ~(1 << pg%8); + } + } void PageFrameAllocator::stats(){ diff --git a/kernel/memory/pageframealloc.h b/kernel/memory/pageframealloc.h index 8f9a2e6..22534b2 100644 --- a/kernel/memory/pageframealloc.h +++ b/kernel/memory/pageframealloc.h @@ -5,6 +5,8 @@ #include "../memory/pageframe.h" namespace PageFrameAllocator { + extern uint8_t bitmap[4294967296 / 4096 / 8]; + void init (); void stats (); PageFrame* alloc(bool kernel);