From 26f4b6e6ba7b2d542130c9abf5cdc005b6014e65 Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Sun, 28 Dec 2025 02:30:21 +0800 Subject: fixed(proc):Fix the page table mapping error during process fork --- src/kernel/proc/proc.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'src/kernel/proc') diff --git a/src/kernel/proc/proc.cc b/src/kernel/proc/proc.cc index 008f740..b0ab370 100644 --- a/src/kernel/proc/proc.cc +++ b/src/kernel/proc/proc.cc @@ -144,17 +144,22 @@ int fork() } np->pagetable = VM::uvmcreate(); + if (VM::uvmcopy(p->pagetable, np->pagetable, p->sz) < 0) { - PMM::free_page(np->kstack); - PMM::free_page(np->tf); - Spinlock::acquire(&proc_lock); - np->state = UNUSED; + freeproc(np); Spinlock::release(&proc_lock); return -1; } np->sz = p->sz; + if (VM::mappages(np->pagetable, TRAPFRAME, PGSIZE, + (uint64)np->tf, PTE_R | PTE_W) < 0) + { + freeproc(np); + return -1; + } + *(np->tf) = *(p->tf); np->tf->a0 = 0; @@ -272,7 +277,7 @@ namespace ProcManager } p->pagetable = VM::uvmcreate(); - + uint64 initcode_sz = initcode_end - initcode_start; VM::uvminit(p->pagetable, (uchar *)initcode_start, initcode_sz); p->sz = PGSIZE; -- cgit v1.2.3