switch to linked list for alloc
This commit is contained in:
@@ -10,6 +10,8 @@
|
|||||||
|
|
||||||
//uint8_t PageFrameAllocator::bitmap[4294967296 / 4096 / 8];
|
//uint8_t PageFrameAllocator::bitmap[4294967296 / 4096 / 8];
|
||||||
PageFrame PageFrameAllocator::PageFrames[4294967296 / 4096];
|
PageFrame PageFrameAllocator::PageFrames[4294967296 / 4096];
|
||||||
|
Queue<PageFrame> user_memory_q;
|
||||||
|
Queue<PageFrame> kernel_memory_q;
|
||||||
|
|
||||||
void mark_pageframes(uintptr_t start, uintptr_t end, bool available){
|
void mark_pageframes(uintptr_t start, uintptr_t end, bool available){
|
||||||
// DBG << "start: " << hex << start << " end: " << end;
|
// DBG << "start: " << hex << start << " end: " << end;
|
||||||
@@ -19,16 +21,24 @@ void mark_pageframes(uintptr_t start, uintptr_t end, bool available){
|
|||||||
start = 4294967296;
|
start = 4294967296;
|
||||||
if(end > 4294967296)
|
if(end > 4294967296)
|
||||||
end = 4294967296;
|
end = 4294967296;
|
||||||
|
|
||||||
|
if(start < 0x4000000 && end > 0x4000000){
|
||||||
|
mark_pageframes(start, 0x4000000, available);
|
||||||
|
mark_pageframes(0x4000000, end, available);
|
||||||
|
}
|
||||||
|
|
||||||
//DBG << " page start: " << hex << start << " end: " << end << endl;
|
//DBG << " page start: " << hex << start << " end: " << end << endl;
|
||||||
|
Queue<PageFrame>* q = start<0x4000000?&kernel_memory_q:&user_memory_q;
|
||||||
|
|
||||||
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::PageFrames[pg].available = available;
|
PageFrameAllocator::PageFrames[pg].available = available;
|
||||||
//if(available)
|
|
||||||
// PageFrameAllocator::bitmap[pg/8] |= (1 << pg%8);
|
if(available)
|
||||||
//else
|
q->enqueue(PageFrameAllocator::PageFrames[pg]);
|
||||||
// PageFrameAllocator::bitmap[pg/8] &= ~(1 << pg%8);
|
else
|
||||||
|
q->remove(&PageFrameAllocator::PageFrames[pg]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,8 +52,12 @@ void PageFrameAllocator::init(){
|
|||||||
uintptr_t end = (uintptr_t)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();
|
||||||
|
|
||||||
if(available)
|
if(available){
|
||||||
mark_pageframes(start, end, true);
|
if(start < (uintptr_t)&___KERNEL_END___)
|
||||||
|
start = Page::ceil((uintptr_t)&___KERNEL_END___ +1);
|
||||||
|
|
||||||
|
mark_pageframes(start, end, available);
|
||||||
|
}
|
||||||
|
|
||||||
memory_map_entry = memory_map_entry->getNext();
|
memory_map_entry = memory_map_entry->getNext();
|
||||||
}
|
}
|
||||||
@@ -55,8 +69,9 @@ void PageFrameAllocator::init(){
|
|||||||
uintptr_t end = (uintptr_t)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();
|
||||||
|
|
||||||
if(!available)
|
if(!available){
|
||||||
mark_pageframes(start, end, false);
|
mark_pageframes(start, end, available);
|
||||||
|
}
|
||||||
|
|
||||||
memory_map_entry = memory_map_entry->getNext();
|
memory_map_entry = memory_map_entry->getNext();
|
||||||
}
|
}
|
||||||
@@ -113,31 +128,18 @@ void PageFrameAllocator::stats(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void* PageFrameAllocator::alloc(bool kernel){
|
void* PageFrameAllocator::alloc(bool kernel){
|
||||||
uintptr_t search_start;
|
Queue<PageFrame>* q = kernel?&kernel_memory_q:&user_memory_q;
|
||||||
uintptr_t search_end;
|
PageFrame* free_pageframe = q->dequeue();
|
||||||
if(kernel){
|
|
||||||
search_start = Page::ceil((uintptr_t)&___KERNEL_END___);
|
|
||||||
search_end = 0x4000000;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
search_start = 0x4000000;
|
|
||||||
search_end = 0x8000000; //TODO find some appropriate value
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t free_pageframe=0;
|
|
||||||
//TODO make this more efficent
|
|
||||||
for(uint64_t i=search_start/4096; i < search_end/4096; i++){
|
|
||||||
if(PageFrames[i].available){
|
|
||||||
free_pageframe = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!free_pageframe)
|
if(!free_pageframe)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
mark_pageframes(free_pageframe*4096, (free_pageframe*4096)+1, false);
|
free_pageframe->available = false;
|
||||||
return (void*)(free_pageframe*4096);
|
|
||||||
|
uintptr_t addr = ((free_pageframe - &PageFrames[0]))<<12;
|
||||||
|
|
||||||
|
mark_pageframes(addr, addr+1, false);
|
||||||
|
return (void*)(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PageFrameAllocator::free(PageFrame* frame){
|
void PageFrameAllocator::free(PageFrame* frame){
|
||||||
|
|||||||
Reference in New Issue
Block a user