diff options
| author | Richard Qin <richard.qin.x@gmail.com> | 2025-12-28 02:30:21 +0800 |
|---|---|---|
| committer | Richard Qin <richard.qin.x@gmail.com> | 2025-12-28 02:30:21 +0800 |
| commit | 26f4b6e6ba7b2d542130c9abf5cdc005b6014e65 (patch) | |
| tree | 52c97bb12cc5765be9e2dc0fc2353ea68fcf2112 /src | |
| parent | d782a7a8127db041ec4ba1098740f7f49085ef8a (diff) | |
| download | lume-26f4b6e6ba7b2d542130c9abf5cdc005b6014e65.tar.gz lume-26f4b6e6ba7b2d542130c9abf5cdc005b6014e65.tar.xz | |
fixed(proc):Fix the page table mapping error during process fork
Diffstat (limited to 'src')
| -rw-r--r-- | src/kernel/proc/proc.cc | 15 | ||||
| -rw-r--r-- | src/kernel/syscall.cc | 1 |
2 files changed, 11 insertions, 5 deletions
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; } |
