2-9-9-12分页机制(xp/xp后的32位系统)
PAE#
PAE(Physical Address Extension)为物理地址扩展,传统的10-10-12分页最多可以访问的物理内存为4GB无法满足需要,通过物理地址扩展增加PTB增加访问到物理地址的上限。Inter用MAXPHYADDR来表示能访问到的最大的物理地址位数,对于我们个人计算机而言为36位即64GB。
10-10-12分页限制#
10-10-12分页因为页表项PTE只有四个字节所以只能访问2^32 = 4GB物理地址空间,现在的物理内存都大于4GB为了能访问到更多的物理内存2-9-9-12将PTE的大小增加到了8个字节,其中36位用来表示物理页基地址,这样就可以访问到2^36 = 64GB物理地址空间。因为一个物理页大小一般为4kb,为了增加页表中PTE的大小,PTB从4个字节变为8个字节(扩大了二倍),所以页表长度就减小了(缩小二倍,10减到9)。
2-9-9-12分页#
线性地址的2是页目录指针表PDTPT的索引,9是页目录表PDT的索引,下一个9是页表PTT的索引,下一个12是页内偏移地址。
PDTPT,PDT,PTT的每一项都是八个字节。CR3现在指向的是PDTPT页目录表指针表,0-4位忽略后0-31位表示PDTPT表物理基地址。(M表示MAXPHYADDR = 36)
PDTPE是页目录指针表项,其0位依然是P有效位,0-35位指向PDT页目录表(0-11位置0)。
PDE的PS位如果为1,表示物理页大小为2^ 21 (9 + 12)= 2MB,PDE的35-21位(PFN物理页帧)为物理地址对应的高15位,低21位置0。
PDE的PS为如果为0,表示物理页大小为2^ 12 = 4kb,PDE的35-12位为PTT的物理地址。
G位是全局位(此线性地址为高2GB地址)只有当其PS位为1时才有G位否则无G位,如果为1那么当CR3变化时,不会清除TLB表中此地址对应的项,提高效率。
PTE也有XD不可执行位和G位全局位,注意只要PDE和PTE中其中一个的XD位为1就可以使此地址对应的数据无法执行。其他位都需要与一下。
在3环读写高2GB地址内存#
printf("0x%x", (*(DWORD*)0x8003f048));
(*(DWORD*)0x8003f048) = 0x12345678;
printf("0x%x", (*(DWORD*)0x8003f048));
我们在windbg中查看地址0x8003f048线性地址对应的物理地址等信息。
我们在windbg中将PDE和PTE的的U/S位设为1即可读取此高地址的内存
注意:一个PTT页表包含512个页表项而且每一个页表都指向4kb大小的物理页,一个PDT页目录表有512个页目录项所以共指向4kb*512 = 2Mb物理内存,一个PDPT页目录指针表有512个页目录指针项所以共指向2Mb*512 = 1GB物理内存,一共有4个PDPT页目录指针表所以一共能映射1GB*4=4GB虚拟地址空间,刚好和X86的虚拟地址空间匹配。(内核空间的系统页表PTE与用户空间的页表PTE都会保存在0xC0000000(PTE_BASE)地址处,一般PDT的前半部分为用户地址空间的PDE,后半部分为系统地址空间的PDE)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】