Merge remote-tracking branch 'refs/remotes/origin/master'

This commit is contained in:
user
2026-02-23 15:55:53 +01:00
4 changed files with 55 additions and 35 deletions

View File

@@ -93,7 +93,7 @@ extern "C" int main() {
offset += 1+(appsize/4096); 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(); p<Multiboot::getModule(0)->getEndAddress(); p=(void*)((uintptr_t)p+4096)){ //for(void* p=Multiboot::getModule(0)->getStartAddress(); p<Multiboot::getModule(0)->getEndAddress(); p=(void*)((uintptr_t)p+4096)){
// DBG << "module at: " << hex << p << endl; // DBG << "module at: " << hex << p << endl;
// g.vault().scheduler.ready(new Thread(false, p)); // g.vault().scheduler.ready(new Thread(false, p));

View File

@@ -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();
} }
@@ -121,31 +136,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){

View File

@@ -8,13 +8,20 @@ extern "C" void main() {
//sys_test(1,2,3,4,5); //sys_test(1,2,3,4,5);
unsigned id = sys_getpid(); unsigned id = sys_getpid();
char text[] = "testX"; char text[] = "app X";
text[4] = 0x30+id; text[4] = 0x30+id;
char buf = 32; char buf = 32;
for (unsigned i = 1;; ++i) {
write(1, text, sizeof(text));
void* ptr= map(512);
write(1, text, sizeof(text), 0, (int)id);
uint8_t cnt = 0;
for (unsigned i = 1;; ++i) {
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); //sprintf(&buf, "ptr address: %x \n" , ptr);
//unmap(ptr, 512); //unmap(ptr, 512);

View File

@@ -8,16 +8,25 @@
extern "C" void main() { extern "C" void main() {
char cmd_buff[100]; char cmd_buff[100];
uint8_t bufferpos = 0; 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){ while(1){
char msg[11]; char msg[11];
int len; int len;
len = read(0, msg, 1); len = read(0, msg, 1);
if(len){ if(len){
write(0, msg, len); write(0, msg, len, 6+x, id);
memcpy(&cmd_buff[bufferpos], msg, len); memcpy(&cmd_buff[bufferpos], msg, len);
bufferpos+=len; bufferpos+=len;
for(uint8_t i=0; i<len; i++) for(uint8_t i=0; i<len; i++)
if(msg[i] == '\n'){ if(msg[i] == '\n'){
x=0;
write(0, " ", 52, 6+x, id);
bufferpos = 0; bufferpos = 0;
if(strncmp(cmd_buff, "kill ", 5) == 0){ if(strncmp(cmd_buff, "kill ", 5) == 0){
int pid = cmd_buff[5]-0x30; int pid = cmd_buff[5]-0x30;
@@ -32,6 +41,8 @@ extern "C" void main() {
} }
} }
} }
else
x++;
} }
} }
} }