From 8b271e24701657ed3ca0699bc5231bc7a6d98ff9 Mon Sep 17 00:00:00 2001 From: Eggert Jung Date: Wed, 25 Feb 2026 11:32:22 +0100 Subject: [PATCH] wip on fork minimal example works --- kernel/main.cc | 6 +++--- kernel/memory/pagetable.cc | 2 ++ kernel/syscall/skeleton.cc | 29 ++++++++++++++++++++++------- kernel/syscall/stub.asm | 14 ++++++++++++++ kernel/thread/thread.cc | 7 ++++--- kernel/thread/thread.h | 7 ++++--- notes | 3 +++ user/app1/appl.cc | 14 ++++++++++++-- 8 files changed, 64 insertions(+), 18 deletions(-) diff --git a/kernel/main.cc b/kernel/main.cc index a2b42d6..71bc399 100644 --- a/kernel/main.cc +++ b/kernel/main.cc @@ -100,9 +100,9 @@ extern "C" int main() { } - Thread* thread_ptr = new Thread(false, (void*)0x4000000, (void*)0x4001000, 2); - g.vault().scheduler.ready(thread_ptr); - g.vault().thread_list[thread_ptr->id] = thread_ptr; + //Thread* thread_ptr = new Thread(false, (void*)0x4000000, (void*)0x4001000, 2); + //g.vault().scheduler.ready(thread_ptr); + //g.vault().thread_list[thread_ptr->id] = thread_ptr; //for(void* p=Multiboot::getModule(0)->getStartAddress(); pgetEndAddress(); p=(void*)((uintptr_t)p+4096)){ // DBG << "module at: " << hex << p << endl; diff --git a/kernel/memory/pagetable.cc b/kernel/memory/pagetable.cc index 03c1881..5cf565c 100644 --- a/kernel/memory/pagetable.cc +++ b/kernel/memory/pagetable.cc @@ -231,6 +231,8 @@ void copy_pagetable(four_lvl_paging_t* parent_table, four_lvl_paging_t* child_ta ((uintptr_t)i3<<30) | ((uintptr_t)i2<<21) | ((uintptr_t)i1<<12) ; + if(vaddr < 0x4000000) + continue; if(!isMapped(vaddr, child_table)){ //only copy if not part of basic pagetable assert( (i3>0) || (i2>=32)); //assert user memory diff --git a/kernel/syscall/skeleton.cc b/kernel/syscall/skeleton.cc index afb363c..d75499b 100644 --- a/kernel/syscall/skeleton.cc +++ b/kernel/syscall/skeleton.cc @@ -9,6 +9,7 @@ #include "../thread/scheduler.h" #include "../memory/pageframealloc.h" #include "../memory/pagetable.h" +#include "../arch/idt.h" void *operator new(size_t, void *); //#include "../user/app1/appl.h" @@ -175,8 +176,6 @@ namespace Syscall { bool copy_from_phys(Vault& vault, uintptr_t phys_ptr, void* virt_ptr, size_t size) { - Thread* current_thread = vault.scheduler.active(); - size_t offset = Page::offset(phys_ptr); size_t total_size = size + offset; four_lvl_paging_t* search_table = vault.scheduler.active()->paging_tree; @@ -185,10 +184,10 @@ bool copy_from_phys(Vault& vault, uintptr_t phys_ptr, void* virt_ptr, size_t siz if (virt_addr == nullptr) { return false; } - - for(uint8_t i =0; ipaging_tree); - } + + for(uint8_t i =0; ipaging_tree); + } memcpy(virt_ptr, (void*)((uintptr_t)(virt_addr)+ (uintptr_t)offset), size); setMapping((uintptr_t)(virt_addr), 0, search_table); @@ -280,9 +279,25 @@ bool reply(Vault& v, const void* buffer, size_t size) { return true; } +void copy_stack(Thread* parent, Thread* child){ + uintptr_t dest_frame = isMapped((uintptr_t)child->StackPointer.user, child->paging_tree); + void* dest_vaddr = getFreeVirtSpace(parent->paging_tree, 1); + setMapping((uintptr_t)dest_vaddr, (void*)dest_frame, parent->paging_tree); + + memcpy(dest_vaddr, (void*)0x6000000/*((uintptr_t)parent->StackPointer.user & ~0xFFF)*/, 4096); + + setMapping((uintptr_t)dest_vaddr, 0, parent->paging_tree); +} + int fork(Vault &vault, InterruptContext *user_context) { Thread* parent = vault.scheduler.active(); - //Thread* child = new Thread(false, + Thread* child = new Thread(false, (void*)user_context->ip, parent->code_paddr, parent->code_pagenum); + copy_pagetable(parent->paging_tree, child->paging_tree); + copy_stack(parent, child); + + child->StackPointer.user = (void*)user_context->sp; + + vault.scheduler.ready(child); return 0; } diff --git a/kernel/syscall/stub.asm b/kernel/syscall/stub.asm index dab2ab9..c367442 100644 --- a/kernel/syscall/stub.asm +++ b/kernel/syscall/stub.asm @@ -6,7 +6,21 @@ align 8 sys_call: ; BSB2 1 - Syscall stub + push rbx + push rbp + push r11 + push r12 + push r13 + push r14 + push r15 int 0x80 + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop rbp + pop rbx ret diff --git a/kernel/thread/thread.cc b/kernel/thread/thread.cc index c3ae3b0..1a48754 100644 --- a/kernel/thread/thread.cc +++ b/kernel/thread/thread.cc @@ -4,6 +4,7 @@ #include "../arch/core_ring.h" #include "../memory/pageframealloc.h" #include "../memory/pagetable.h" +#include "../memory/page.h" #include "../debug/kernelpanic.h" #include "../interrupt/guard.h" #include "debug/output.h" @@ -49,11 +50,11 @@ void Thread::map_app(void* code_paddr, uint16_t code_page_num, void* stack_vaddr } } -Thread::Thread (bool kernel, void* start_addr, void * codeframe, int code_frame_num): queue_link(nullptr), isKernel(kernel), start(start_addr), id(idCounter++), kill_flag(false){ +Thread::Thread (bool kernel, void* start_addr, void * codeframe, int code_frame_num): queue_link(nullptr), isKernel(kernel), start(start_addr), code_paddr(codeframe), code_pagenum(code_frame_num), id(idCounter++), kill_flag(false){ StackPointer.isr = reinterpret_cast((uintptr_t)PageFrameAllocator::alloc(true)+STACK_SIZE);// mapped due to identity mapping - StackPointer.user = (void*)(0x61FF000+STACK_SIZE); + StackPointer.user = (void*)(0x6000000+STACK_SIZE); - map_app(codeframe, code_frame_num, StackPointer.user, 1); + map_app(codeframe, code_frame_num, (void*)((uintptr_t)StackPointer.user-STACK_SIZE), 1); prepareContext(StackPointer.isr, context, kickoff, reinterpret_cast(this), 0, 0); } diff --git a/kernel/thread/thread.h b/kernel/thread/thread.h index e2c5427..4b22188 100644 --- a/kernel/thread/thread.h +++ b/kernel/thread/thread.h @@ -57,7 +57,6 @@ class Thread { /*! \brief Context of the thread, used for saving and restoring the register * values when context switching. */ - Context context; /*! \brief The thread's entry point. * @@ -87,9 +86,11 @@ class Thread { } StackPointer; void* operator new ( size_t count )noexcept; + Context context; four_lvl_paging_t* paging_tree; - pagetable_t* appcode_table; - pagetable_t* appstack_table; + + void* code_paddr; + int code_pagenum; Semaphore ipc_sem; Queue ipc_queue; diff --git a/notes b/notes index d8a3ddf..8bfdd6f 100644 --- a/notes +++ b/notes @@ -31,3 +31,6 @@ | | | | schedule(2) kickoff + + +p/x ((pagetable_t*)(((pagetable_t*)(((pagetable_t*)(child.paging_tree.l4.entries[0].address<<12)).entries[0].address<<12)).entries[0].address<<12)).entries[0] diff --git a/user/app1/appl.cc b/user/app1/appl.cc index 916bc66..7103a29 100644 --- a/user/app1/appl.cc +++ b/user/app1/appl.cc @@ -45,13 +45,23 @@ extern "C" void main() { //sys_test(1,2,3,4,5); + fork(); + unsigned id = sys_getpid(); char text[] = "appX"; text[3] = 0x30+id; - write(1, text, sizeof(text), 0, (int)id); - uint8_t cnt = 0; + + while(1){ + cnt = (cnt+1)%100; + char msg[12]; + char* num = itoa(cnt, msg); + write(1, num, strlen(num), 10, (int)id); + sleep(100); + } + + for (uint8_t i = 1;; ++i) { //counter to see app running cnt=(cnt+1)%100;