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 --- build/kernel.elf | Bin 63616 -> 63824 bytes build/src/kernel/proc/proc.o | Bin 117608 -> 118560 bytes build/src/kernel/syscall.o | Bin 81288 -> 81848 bytes src/kernel/proc/proc.cc | 15 ++++++++++----- src/kernel/syscall.cc | 1 + 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/build/kernel.elf b/build/kernel.elf index 448fcfe..1ccfb25 100755 Binary files a/build/kernel.elf and b/build/kernel.elf differ diff --git a/build/src/kernel/proc/proc.o b/build/src/kernel/proc/proc.o index d22780c..ef1e81e 100644 Binary files a/build/src/kernel/proc/proc.o and b/build/src/kernel/proc/proc.o differ diff --git a/build/src/kernel/syscall.o b/build/src/kernel/syscall.o index 2029868..259a780 100644 Binary files a/build/src/kernel/syscall.o and b/build/src/kernel/syscall.o differ 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; diff --git a/src/kernel/syscall.cc b/src/kernel/syscall.cc index 13bdbac..92b1a1b 100644 --- a/src/kernel/syscall.cc +++ b/src/kernel/syscall.cc @@ -99,6 +99,7 @@ uint64 sys_write() if (VM::copyin(proc->pagetable, buf, p + i, len) < 0) { + Drivers::uart_puts("sys_write: copyin failed\n"); return -1; } -- cgit v1.2.3