fix(paging): drop high-half stack clone that faulted during runtime spawn
This commit is contained in:
1 parent
8ef0a8ac2f
commit
d9294dbe49
1 file changed
+4
-6
@@ -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
|
||||
|
||||
Reference in new issue
Block a user