#include "../memory/pageframealloc.h" #include "../boot/multiboot/data.h" #include "pageframe.h" #include "../debug/output.h" #include "../memory/config.h" #include "../arch/lapic.h" #include "../arch/apic.h" uint8_t PageFrameAllocator::bitmap[4294967296 / 4096 / 8]; void mark_unavailable(uintptr_t start, uintptr_t end){ DBG << "start: " << hex << start << " end: " << end << endl; for(uint64_t i = start; i < end; i += 4096){ uint64_t pg = i/4096; PageFrameAllocator::bitmap[pg/8] &= ~(1 << pg%8); } } void PageFrameAllocator::init(){ Multiboot::Memory* memory_map_entry = Multiboot::getMemoryMap(); dout << "kernel start: " << ___KERNEL_START___; dout << " kernel end: " << ___KERNEL_END___ << endl; while(memory_map_entry != 0){ void* start = memory_map_entry->getStartAddress(); void* end = memory_map_entry->getEndAddress(); bool available = memory_map_entry->isAvailable(); //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(); } DBG << "kernel image "; mark_unavailable((uintptr_t)&___KERNEL_START___, (uintptr_t)&___KERNEL_END___); DBG << "ISA adresses "; mark_unavailable(0x00F00000, 0x00FFFFFF); DBG << "LAPIC "; mark_unavailable(0xfee00000, 0xfee003f0); DBG << "IO APIC "; mark_unavailable(APIC::getIOAPICAddress(), APIC::getIOAPICAddress()+0x10); stats(); } void PageFrameAllocator::stats(){ Multiboot::Memory* memory_map_entry = Multiboot::getMemoryMap(); while(memory_map_entry != 0){ void* start = memory_map_entry->getStartAddress(); void* end = memory_map_entry->getEndAddress(); bool available = memory_map_entry->isAvailable(); DBG << "Memory: " << hex << start << " to " << end << " is available: " << available << "." << endl; memory_map_entry = memory_map_entry->getNext(); } uint64_t pages_available = 0; for(uint64_t i=0; i