From d9294dbe4986200b590541f998b9fcfa12439452 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 29 Oct 2026 01:44:41 +0800 Subject: [PATCH] fix(paging): drop high-half stack clone that faulted during runtime spawn --- VKernel/Kernel/paging/paging.vp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/VKernel/Kernel/paging/paging.vp b/VKernel/Kernel/paging/paging.vp index c8f5e57..ee1571c 100644 --- a/VKernel/Kernel/paging/paging.vp +++ b/VKernel/Kernel/paging/paging.vp @@ -697,12 +697,10 @@ def clone_for_process(isolate_vaddr: uint64, stack_vaddr: uint64 = 0) -> uint64: for i in range(512): new_pt_page.entries[i] = kernel_pt.entries[i] & ~PTE_USER new_pd_page.entries[pd_idx] = (uint64(new_pt_page) & ~uint64(0xFFF)) | (kernel_pd.entries[pd_idx] & uint64(0xFFF) & ~PTE_USER) - # 用户栈(含 user thread 栈)都落在同一个高地址区;必须为每个进程私有化 - # 对应的 PML4/PDP/PD/PT 分支,否则新进程映射栈会覆盖父进程的栈 PTE。 - if stack_vaddr != 0: - _clone_vaddr(new_pml4_page, stack_vaddr) - _clone_vaddr(new_pml4_page, stack_vaddr - uint64(0x200000)) - _clone_vaddr(new_pml4_page, stack_vaddr - uint64(0x400000)) + # 以 kernel PML4 为模板时,PML4[511](用户栈所在高半区)通常没有映射; + # 之后 _elf_entry_wrapper 里的 MapPage 会为该进程新建私有 PDP/PD/PT。 + # 不要在这里额外 clone 高半区:kernel PML4[511] 可能含有 1GiB/大页或 + # 非用户映射,强行拆分会在 clone 阶段访问用户栈 VA 触发内核 #PF。 return uint64(new_pml4_page) # Deep-copy every USER mapping from src into dst (dst must already contain the