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)