wip on fork

minimal example works
This commit is contained in:
2026-02-25 11:32:22 +01:00
parent 22ab2fb2a5
commit 8b271e2470
8 changed files with 64 additions and 18 deletions

View File

@@ -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; i<size/4096 +1; i++){
setMapping((uintptr_t)virt_addr, (void*)phys_ptr, vault.scheduler.active()->paging_tree);
}
for(uint8_t i =0; i<size/4096 +1; i++){
setMapping((uintptr_t)virt_addr, (void*)phys_ptr, vault.scheduler.active()->paging_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;
}

View File

@@ -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