wip on allocator

This commit is contained in:
2026-01-12 11:59:25 +01:00
parent 139d91fdfc
commit c0c4b64ef9
3 changed files with 73 additions and 25 deletions

View File

@@ -1,8 +1,16 @@
#ifndef _PAGEFRAME_H_ #ifndef _PAGEFRAME_H_
#define _PAGEFRAME_H_ #define _PAGEFRAME_H_
#include "../types.h"
class PageFrame { class PageFrame {
private: private:
uintptr_t address;
uintptr_t mapped_address;
public: public:
PageFrame(); PageFrame* queue_link;
PageFrame(uintptr_t a):address(a){};
uintptr_t getAddr(){return address;};
uintptr_t getVirtualAddr(){return address;};
}; };
#endif #endif

View File

@@ -1,5 +1,6 @@
#include "../memory/pageframealloc.h" #include "../memory/pageframealloc.h"
#include "../boot/multiboot/data.h" #include "../boot/multiboot/data.h"
#include "page.h"
#include "pageframe.h" #include "pageframe.h"
#include "../debug/output.h" #include "../debug/output.h"
@@ -9,48 +10,64 @@
uint8_t PageFrameAllocator::bitmap[4294967296 / 4096 / 8]; uint8_t PageFrameAllocator::bitmap[4294967296 / 4096 / 8];
void mark_unavailable(uintptr_t start, uintptr_t end){ //PageFrame PageFrameList[4294967296 / 4096];
DBG << "start: " << hex << start << " end: " << end << endl;
void mark_pageframes(uintptr_t start, uintptr_t end, bool available){
DBG << "start: " << hex << start << " end: " << end;
start = Page::floor(start);
end = Page::ceil(end);
DBG << " page start: " << hex << start << " end: " << end << endl;
for(uint64_t i = start; i < end; i += 4096){ for(uint64_t i = start; i < end; i += 4096){
uint64_t pg = i/4096; uint64_t pg = i/4096;
PageFrameAllocator::bitmap[pg/8] &= ~(1 << pg%8); if(available)
PageFrameAllocator::bitmap[pg/8] |= (1 << pg%8);
else
PageFrameAllocator::bitmap[pg/8] &= ~(1 << pg%8);
} }
} }
void PageFrameAllocator::init(){ void PageFrameAllocator::init(){
Multiboot::Memory* memory_map_entry = Multiboot::getMemoryMap(); Multiboot::Memory* memory_map_start = Multiboot::getMemoryMap();
Multiboot::Memory* memory_map_entry = memory_map_start;
dout << "kernel start: " << ___KERNEL_START___; //mark as available
dout << " kernel end: " << ___KERNEL_END___ << endl;
while(memory_map_entry != 0){ while(memory_map_entry != 0){
void* start = memory_map_entry->getStartAddress(); uintptr_t start = (uintptr_t)memory_map_entry->getStartAddress();
void* end = memory_map_entry->getEndAddress(); uintptr_t end = (uintptr_t)memory_map_entry->getEndAddress();
bool available = memory_map_entry->isAvailable(); bool available = memory_map_entry->isAvailable();
//TODO priotity for conflicting regions if(available)
for(uint64_t i = (uint64_t)start; i < (uint64_t)end; i += 4096){ mark_pageframes(start, end, true);
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(); memory_map_entry = memory_map_entry->getNext();
} }
//mark as unavailable
memory_map_entry = memory_map_start;
while(memory_map_entry != 0){
uintptr_t start = (uintptr_t)memory_map_entry->getStartAddress();
uintptr_t end = (uintptr_t)memory_map_entry->getEndAddress();
bool available = memory_map_entry->isAvailable();
if(!available)
mark_pageframes(start, end, false);
memory_map_entry = memory_map_entry->getNext();
}
//mark other known regions as unavailable
DBG << "kernel image "; DBG << "kernel image ";
mark_unavailable((uintptr_t)&___KERNEL_START___, (uintptr_t)&___KERNEL_END___); mark_pageframes((uintptr_t)&___KERNEL_START___, (uintptr_t)&___KERNEL_END___, false);
DBG << "ISA adresses "; DBG << "ISA adresses ";
mark_unavailable(0x00F00000, 0x00FFFFFF); mark_pageframes(0x00F00000, 0x00FFFFFF, false);
DBG << "LAPIC "; DBG << "LAPIC ";
mark_unavailable(0xfee00000, 0xfee003f0); mark_pageframes(0xfee00000, 0xfee003f0, false);
DBG << "IO APIC "; DBG << "IO APIC ";
mark_unavailable(APIC::getIOAPICAddress(), APIC::getIOAPICAddress()+0x10); mark_pageframes(APIC::getIOAPICAddress(), APIC::getIOAPICAddress()+0x10, false);
stats(); stats();
} }
@@ -66,8 +83,7 @@ void PageFrameAllocator::stats(){
} }
uint64_t pages_available = 0; uint64_t pages_available = 0;
for(uint64_t i=0; i<sizeof(bitmap)*8;i++) for(uint64_t i=0; i<sizeof(bitmap)*8;i++){
{
if(bitmap[i/8] & (1<<i%8)) if(bitmap[i/8] & (1<<i%8))
pages_available++; pages_available++;
} }
@@ -89,11 +105,33 @@ void PageFrameAllocator::stats(){
DBG << '/'; DBG << '/';
} }
DBG << "\npages available: " << dec << pages_available << endl; DBG << "\npages available: " << dec << pages_available << endl;
} }
PageFrame* PageFrameAllocator::alloc(bool kernel){ PageFrame* PageFrameAllocator::alloc(bool kernel){
(void) kernel; uintptr_t search_start;
uintptr_t search_end;
if(kernel){
search_start = Page::ceil((uintptr_t)&___KERNEL_END___);
search_end = 0x4000000;
}
else{
search_start = 0x4000000;
search_end = 0x8000000;
}
uint64_t free_pageframe=0;
//TODO make this more efficent
for(uint64_t i=search_start/4096; i < search_end/4096; i++){
if(bitmap[i/8]&(1<<i%8)){
free_pageframe = i;
break;
}
}
if(!free_pageframe)
return 0;
mark_pageframes(free_pageframe*4096, free_pageframe*4096, false);
return 0; return 0;
} }

View File

@@ -3,9 +3,11 @@
#include <types.h> #include <types.h>
#include "../memory/pageframe.h" #include "../memory/pageframe.h"
#include "../object/queue.h"
namespace PageFrameAllocator { namespace PageFrameAllocator {
extern uint8_t bitmap[4294967296 / 4096 / 8]; extern uint8_t bitmap[4294967296 / 4096 / 8];
//Queue<PageFrame> PageFrameList;
void init (); void init ();
void stats (); void stats ();