107 lines
3.0 KiB
C++
107 lines
3.0 KiB
C++
#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<sizeof(bitmap)*8;i++)
|
|
{
|
|
if(bitmap[i/8] & (1<<i%8))
|
|
pages_available++;
|
|
}
|
|
for(uint64_t i=0; i < 0x2000000/4096/8; i++){
|
|
if(i%64 == 0){
|
|
DBG << endl << hex << i * 8 * 4096 << " " << flush;
|
|
int x,y;
|
|
dout.getPos(x,y);
|
|
for(uint8_t i=x; i<10; i++){
|
|
DBG<<" ";
|
|
}
|
|
}
|
|
|
|
if(bitmap[i] == 0xff)
|
|
DBG << '#';
|
|
else if(bitmap[i] == 0x00)
|
|
DBG << '.';
|
|
else
|
|
DBG << '/';
|
|
}
|
|
DBG << "\npages available: " << dec << pages_available << endl;
|
|
|
|
}
|
|
|
|
PageFrame* PageFrameAllocator::alloc(bool kernel){
|
|
(void) kernel;
|
|
return 0;
|
|
}
|
|
|
|
void PageFrameAllocator::free(PageFrame* frame){
|
|
(void) frame;
|
|
}
|
|
|
|
void PageFrameAllocator::free(uintptr_t addr){
|
|
(void) addr;
|
|
}
|