diff --git a/kernel/main.cc b/kernel/main.cc index 8dd9d1c..9173d71 100644 --- a/kernel/main.cc +++ b/kernel/main.cc @@ -93,7 +93,7 @@ extern "C" int main() { offset += 1+(appsize/4096); } - g.vault().scheduler.ready(new Thread(false, (void*)0x4001000, 1)); + g.vault().scheduler.ready(new Thread(false, (void*)0x4001000, 2)); //for(void* p=Multiboot::getModule(0)->getStartAddress(); pgetEndAddress(); p=(void*)((uintptr_t)p+4096)){ // DBG << "module at: " << hex << p << endl; // g.vault().scheduler.ready(new Thread(false, p)); diff --git a/kernel/memory/pageframealloc.cc b/kernel/memory/pageframealloc.cc index fad2955..2025f21 100644 --- a/kernel/memory/pageframealloc.cc +++ b/kernel/memory/pageframealloc.cc @@ -10,6 +10,8 @@ //uint8_t PageFrameAllocator::bitmap[4294967296 / 4096 / 8]; PageFrame PageFrameAllocator::PageFrames[4294967296 / 4096]; +Queue user_memory_q; +Queue kernel_memory_q; void mark_pageframes(uintptr_t start, uintptr_t end, bool available){ // DBG << "start: " << hex << start << " end: " << end; @@ -19,16 +21,24 @@ void mark_pageframes(uintptr_t start, uintptr_t end, bool available){ start = 4294967296; if(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; + Queue* q = start<0x4000000?&kernel_memory_q:&user_memory_q; for(uint64_t i = start; i < end; i += 4096){ uint64_t pg = i/4096; PageFrameAllocator::PageFrames[pg].available = available; - //if(available) - // PageFrameAllocator::bitmap[pg/8] |= (1 << pg%8); - //else - // PageFrameAllocator::bitmap[pg/8] &= ~(1 << pg%8); + + if(available) + q->enqueue(PageFrameAllocator::PageFrames[pg]); + else + q->remove(&PageFrameAllocator::PageFrames[pg]); } } @@ -42,8 +52,12 @@ void PageFrameAllocator::init(){ uintptr_t end = (uintptr_t)memory_map_entry->getEndAddress(); bool available = memory_map_entry->isAvailable(); - if(available) - mark_pageframes(start, end, true); + if(available){ + 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(); } @@ -55,8 +69,9 @@ void PageFrameAllocator::init(){ uintptr_t end = (uintptr_t)memory_map_entry->getEndAddress(); bool available = memory_map_entry->isAvailable(); - if(!available) - mark_pageframes(start, end, false); + if(!available){ + mark_pageframes(start, end, available); + } memory_map_entry = memory_map_entry->getNext(); } @@ -121,31 +136,18 @@ void PageFrameAllocator::stats(){ } void* PageFrameAllocator::alloc(bool 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; //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; - } - } + Queue* q = kernel?&kernel_memory_q:&user_memory_q; + PageFrame* free_pageframe = q->dequeue(); if(!free_pageframe) return 0; - mark_pageframes(free_pageframe*4096, (free_pageframe*4096)+1, false); - return (void*)(free_pageframe*4096); + free_pageframe->available = false; + + uintptr_t addr = ((free_pageframe - &PageFrames[0]))<<12; + + mark_pageframes(addr, addr+1, false); + return (void*)(addr); } void PageFrameAllocator::free(PageFrame* frame){ diff --git a/user/app1/appl.cc b/user/app1/appl.cc index 10f08ac..93bc095 100644 --- a/user/app1/appl.cc +++ b/user/app1/appl.cc @@ -8,14 +8,21 @@ extern "C" void main() { //sys_test(1,2,3,4,5); unsigned id = sys_getpid(); - char text[] = "testX"; + char text[] = "app X"; text[4] = 0x30+id; - char buf= 32 ; + char buf = 32; + + write(1, text, sizeof(text), 0, (int)id); + + uint8_t cnt = 0; for (unsigned i = 1;; ++i) { - write(1, text, sizeof(text)); + char msg[5]; + msg[0] = 0x30+cnt; + msg[1] = 0; + cnt=(cnt+1)%10; + write(1, msg, sizeof(text), 6, (int)id); void* ptr= map(512); - //sprintf(&buf, "ptr address: %x \n" , ptr); //unmap(ptr, 512); diff --git a/user/app2/kappl.cc b/user/app2/kappl.cc index ed6e396..16c518f 100644 --- a/user/app2/kappl.cc +++ b/user/app2/kappl.cc @@ -8,16 +8,25 @@ extern "C" void main() { char cmd_buff[100]; uint8_t bufferpos = 0; + + uint8_t id = sys_getpid(); + uint8_t x = 0; + + char text[] = "kappl"; + write(1, text, sizeof(text), 0, (int)id); + while(1){ char msg[11]; int len; len = read(0, msg, 1); if(len){ - write(0, msg, len); + write(0, msg, len, 6+x, id); memcpy(&cmd_buff[bufferpos], msg, len); bufferpos+=len; for(uint8_t i=0; i