From 4f729b20a356425efb2ae866532ae3d7f8cd33f1 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 29 Aug 2026 17:39:25 +0800 Subject: [PATCH] =?UTF-8?q?fix(kernel):=20=5Fset=5Fpage=5Fwritable=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81=202MB=20=E5=A4=A7=E9=A1=B5=EF=BC=88PD=20?= =?UTF-8?q?=E6=9D=A1=E7=9B=AE=E7=9B=B4=E6=8E=A5=E7=BD=AE=20W=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pml4 页(0xf801000)若经 2MB 大页映射,原实现遇 PS=1 直接 return 导致页表页仍只读,写 pml4.entries 持续 #PF。大页的 W 位在 PD 条目自身,直接置位即可。 --- VKernel/Kernel/paging/paging.vp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/VKernel/Kernel/paging/paging.vp b/VKernel/Kernel/paging/paging.vp index 2f21fea..0cb8027 100644 --- a/VKernel/Kernel/paging/paging.vp +++ b/VKernel/Kernel/paging/paging.vp @@ -205,7 +205,11 @@ def _set_page_writable(phys_addr: t.CUInt64T): pd_s: _p | t.CPtr = t.CType(pdp_s.entries[pdp_idx] & ~t.CUInt64T(0xFFF), _p, t.CPtr) pd_idx: t.CUInt64T = (va >> 21) & 0x1FF if not (pd_s.entries[pd_idx] & PTE_PRESENT): return - if pd_s.entries[pd_idx] & PTE_PS: return + if pd_s.entries[pd_idx] & PTE_PS: + # 2MB 大页:W 位在 PD 条目自身(无下层 PT),直接置位 + pd_s.entries[pd_idx] = pd_s.entries[pd_idx] | t.CUInt64T(PTE_WRITABLE) + c.Asm(f"invlpg [{c.AsmInp(va, t.ASM_DESCR.REG_ANY)}]") + return pt_s: _p | t.CPtr = t.CType(pd_s.entries[pd_idx] & ~t.CUInt64T(0xFFF), _p, t.CPtr) pt_idx: t.CUInt64T = (va >> 12) & 0x1FF pt_s.entries[pt_idx] = pt_s.entries[pt_idx] | t.CUInt64T(PTE_WRITABLE)