第一章 PAE 技术背景:为什么需要物理地址扩展?
1.1 x86 架构的地址空间限制
x86 处理器在 32 位模式下(IA-32),理论地址空间为 2^32 = 4GB。但早期设计中,CPU 通过二级分页(Page Directory + Page Table)管理内存,页目录项(PDE)和页表项(PTE)各占 32 位:
- 传统页表结构:
- 32 位虚拟地址分为 10 位目录索引(Directory)+ 10 位页表索引(Table)+ 12 位页内偏移(Offset)。
- PDE/PTE 中,高 20 位是物理地址的高 20 位(低 12 位用于标志位),因此最多访问 2^20 × 4KB = 4GB 物理内存。
随着服务器和工作站对大内存的需求增加(如数据库需要 8GB + 内存),4GB 限制成为瓶颈。PAE(Physical Address Extension)技术在 Pentium Pro(1995 年)中引入,允许 32 位 CPU 访问超过 4GB 的物理内存,核心变化是:
- 升级页表项为 64 位(PDE/PTE 从 32 位变为 64 位),释放更多位用于物理地址和标志位。
- 改用三级分页(Page Directory Pointer Table + Page Directory + Page Table),支持更大的地址空间。
1.2 PAE 的核心目标
- 突破 4GB 内存限制:通过 36 位物理地址(2^36 = 64GB)支持更大内存。
- 增强内存管理灵活性:新增标志位支持更精细的内存保护、缓存策略和虚拟化(如后来的 VMX 技术依赖 PAE)。
第二章 PAE 页表结构:从二级到三级分页
2.1 传统二级分页 vs PAE 三级分页
特性 | 传统 32 位(非 PAE) | PAE 模式(32 位) |
---|---|---|
页表项大小 | 32 位 | 64 位 |
分页级数 | 二级(PDE/PTE) | 三级(PDPTE/PDE/PTE) |
虚拟地址划分 | 10+10+12 | 2+9+9+12(32 位虚拟地址) |
物理地址位数 | 20 位 | 36 位(实际页表项中存 24 位,通过分段扩展) |
PAE 三级分页的虚拟地址解析(以 32 位虚拟地址为例):
- 第 31-30 位:页目录指针索引(PDPTI,2 位,指向 Page Directory Pointer Table 项)。
- 第 29-21 位:页目录索引(PDI,9 位,指向 Page Directory 项)。
- 第 20-12 位:页表索引(PTI,9 位,指向 Page Table 项)。
- 第 11-0 位:页内偏移(Offset,12 位,4KB 页大小)。
2.2 PAE 页表项的格式
PAE 模式下,三级页表项(PDPTE、PDE、PTE)均为 64 位,但功能不同:
-
PDPTE(Page Directory Pointer Table Entry):
+-------------------+-------------------+-------------------+-------------------+ | 保留 | 物理地址21-30 | 标志位(G、P、RW、U/S等) | +-------------------+-------------------+-------------------+-------------------+ 63 52 32 12 0
- 物理地址部分:存储页目录的物理基址的高 10 位(PAE 页目录基址为 36 位,低 32 位由 CR3 寄存器提供,高 4 位保留,实际用 21-30 位共 10 位)。
- 标志位:包含 P(存在位)、RW(读写权限)、U/S(用户 / 内核权限)、G(全局页)等,共 8 个标志位(比传统 PDE 少,因为 PDE/PTE 承担更多标志)。
-
PDE(Page Directory Entry) 和 PTE(Page Table Entry):
+-------------------+-------------------+-------------------+-------------------+ | 保留 | 物理地址12-35 | 标志位(12个) | +-------------------+-------------------+-------------------+-------------------+ 63 52 32 12 0
-
物理地址部分:
- PDE:指向页表的物理基址(24 位,12-35 位,因为页表基址需 4KB 对齐,低 12 位为 0)。
- PTE:指向物理页的基址(24 位,12-35 位,物理页同样 4KB 对齐,低 12 位为 0)。
- 注意:36 位物理地址由高 24 位(12-35 位)和低 12 位(页内偏移)组成,因此 2^24 × 4KB = 16GB?这里看似矛盾,实际 PAE 通过 “物理地址扩展” 技术,允许在 32 位模式下使用 36 位地址,页表项中的 24 位是高 24 位(12-35 位),加上低 12 位偏移,总 36 位(2^36 = 64GB)。
-
12 个标志位(重点!):
从低 12 位(0-11 位)依次为:- P(Present):0 表示该页不在物理内存中(触发缺页中断)。
- RW(Read/Write):0 为只读,1 为可写(用户空间写只读页会触发保护错误)。
- U/S(User/Supervisor):0 为内核级访问,1 为用户级可访问。
- PWT(Page-level Write-Through):0 为回写缓存,1 为直写缓存(控制 CPU 缓存策略)。
- PCD(Page-level Cache Disable):1 禁止 CPU 缓存该页(用于设备内存映射)。
- A(Accessed):CPU 访问该页时自动置 1(操作系统统计使用情况)。
- D(Dirty):写操作时置 1(页面换出时需写入磁盘)。
- PAT(Page Attribute Table):启用页面属性表(配合 CR4.PAT 标志,定义缓存策略)。
- G(Global):1 表示全局页(TLB 缓存不随进程切换刷新,提升性能)。
- 保留位(位 10-11):早期未定义,后来用于 NX 位(No-Execute,硬件防病毒)。
-
第三章 12 个标志位:内存页的 “属性说明书”
3.1 权限控制类标志(4 个)
- P(存在位):最基础的标志,相当于 “这本书是否在图书馆里”。如果 P=0,CPU 访问时会触发缺页中断,由操作系统从硬盘加载页面。
- RW(读写权限):“这本书能否被修改”。用户程序试图写入 RW=0 的页时,会触发 “权限错误”(Page Fault)。
- U/S(用户 / 内核权限):“这本书允许谁借阅”。U/S=0 时,只有内核(管理员)能访问;U/S=1 时,用户程序(普通读者)也能访问。
- NX(No-Execute,位 11,PAE 扩展标志):“这本书能否当菜谱(执行代码)”。NX=1 时,禁止在该页执行指令(配合 DEP 技术防御缓冲区溢出攻击)。
3.2 缓存与性能类标志(4 个)
- PWT(直写缓存):“新书入库是否立即存档”。PWT=1 时,CPU 写入缓存后立即同步到内存,适合需要实时更新的场景(如文件系统缓存)。
- PCD(禁止缓存):“这本书禁止放入速借柜”。PCD=1 时,CPU 不缓存该页,直接访问物理内存,用于设备寄存器映射(避免缓存导致的不一致)。
- A(访问标志):“这本书最近被借过吗”。CPU 每次访问该页时自动置 1,操作系统定期扫描 A=0 的页,作为换出候选(LRU 算法)。
- G(全局页):“这本书是公共教材吗”。G=1 时,所有进程的 TLB(转换后备缓冲区)都缓存该页,进程切换时无需刷新,提升频繁访问的内核页性能(如内核代码段)。
3.3 状态与扩展类标志(4 个)
- D(脏页标志):“这本书被写过吗”。写入页时置 1,换出到硬盘时,D=1 的页需要先写入磁盘,D=0 的页可直接丢弃(仅适用于可写页)。
- PAT(页面属性表):“这本书属于哪个书架类别”。配合 CR4 寄存器的 PAT 功能,将内存页划分为不同属性组(如 Write-Combining、Write-Through 等),优化缓存策略。
- 保留位(位 8-9):早期 PAE 未定义,后来用于扩展标志(如 NX 位在 IA-32e 模式下启用)。
- AVL(操作系统自定义,位 12-31 中的保留位):供操作系统标记页状态(如 Linux 的 “伙伴系统” 分配标志)。
第四章 24 个物理地址位:如何寻址 64GB 内存?
4.1 PAE 的物理地址扩展机制
传统 32 位 CPU 通过 36 位物理地址线(如 Pentium Pro 的地址总线)支持 64GB 内存,但页表项需要存储这 36 位地址。由于 PAE 页表项是 64 位,其中:
- 低 12 位:标志位(0-11 位)。
- 12-35 位:共 24 位,存储物理地址的高 24 位(因为物理页起始地址是 4KB 对齐,低 12 位为 0)。
- 36-63 位:保留(早期未使用,后来用于 IA-32e 模式的更高地址)。
因此,物理地址 = (页表项中的 24 位地址 << 12) + 页内偏移(12 位),总 36 位(2^36 = 64GB)。
4.2 与传统页表的对比
- 传统 PTE:32 位,高 20 位是物理地址高 20 位(2^20 × 4KB = 4GB)。
- PAE PTE:64 位,12-35 位是物理地址高 24 位(2^24 × 4KB = 16GB?这里需澄清:24 位地址左移 12 位后是 36 位,所以是 2^36 = 64GB,之前的 16GB 是误解,正确应为 64GB)。
误区澄清:用户问题中提到 “24 个物理地址位”,实际是指页表项中存储物理地址的高 24 位(12-35 位),加上低 12 位偏移,总 36 位地址。24 位是页表项中实际存储的地址位数,而非物理地址总位数(36 位)。这是 PAE 设计的关键:通过 64 位页表项,用 24 位存储高地址,突破传统 20 位的限制。
第五章 Linux 内核中的 PAE 支持
5.1 启用 PAE 的条件
- CPU 支持:Pentium Pro 及以上,且 CR4.PAE 标志置 1。
- 内核配置:Linux 内核需编译为 PAE 模式(CONFIG_X86_PAE),32 位内核支持最大 64GB 内存,64 位内核无需 PAE(直接使用 64 位地址)。
5.2 页表操作流程(以虚拟地址转换为例)
- CPU 读取 CR3 寄存器,获取 Page Directory Pointer Table 基址。
- 用虚拟地址的高 2 位索引 PDPTE,检查 P 位:
- P=0:触发缺页中断(内核分配物理页并填充页表)。
- P=1:获取页目录基址(PDPTE 中的 24 位地址左移 12 位)。
- 用虚拟地址的中间 9 位索引 PDE,同样检查 P 位,获取页表基址。
- 用虚拟地址的下一个 9 位索引 PTE,获取物理页基址(24 位地址左移 12 位)。
- 加上页内偏移,得到最终物理地址。
5.3 标志位的内核应用
- G 位优化:内核将常用页(如内核代码段、全局数据)标记为 G=1,减少 TLB 刷新次数。
- PCD/PCD 位:在内核映射设备内存时(如 PCI 设备 BAR 空间),设置 PCD=1 禁止缓存,确保直接访问硬件寄存器。
- D 位管理:swap 子系统通过检查 D 位,决定换出页是否需要写入磁盘。
第六章 PAE 的局限性与演进
6.1 缺点
- 性能开销:三级分页比二级分页多一次内存访问(需访问 PDPTE、PDE、PTE),依赖 TLB 缓存缓解。
- 兼容性:32 位用户空间程序无法直接访问超过 4GB 的内存(需通过内核映射,如 /proc/iomem)。
- 地址空间碎片化:高地址内存(如 32GB-64GB)的分配效率低于 64 位系统。
6.2 后续技术
- IA-32e 模式(x86-64 的 32 位扩展):在 64 位 CPU 上支持更大的地址空间,页表项扩展为 64 位,标志位增加(如 FSGSBASE、SMAP 等)。
- 大页(Huge Pages):PAE 支持 2MB/4MB 大页,减少页表项数量,提升 TLB 命中率(通过 PDE 中的 “大页标志” 区分)。
- 虚拟化:VT-x 技术依赖 PAE 页表结构,实现 Guest 物理地址到 Host 物理地址的转换(EPT 页表)。
第七章 总结:PAE 页表的核心价值
PAE 技术是 32 位 x86 架构向大内存时代的过渡方案,其页表设计的两大创新点:
- 24 位物理地址存储:通过 64 位页表项,突破传统 20 位限制,支持 36 位物理地址(64GB),满足服务器对大内存的需求。
- 12 个标志位:细化内存页的权限、缓存策略、状态跟踪,为操作系统提供更精细的控制能力(如内存保护、性能优化、错误排查)。
尽管现代 x86 系统普遍使用 64 位架构(x86-64),PAE 的设计思想仍影响着内存管理:
- 页表项从 32 位到 64 位的扩展,为后续技术(如大页、虚拟化页表)奠定基础。
- 标志位的分层设计(权限、缓存、状态)成为处理器与操作系统协作的经典范式。
形象比喻:把 PAE 页表比作 “内存图书馆的智能目录”
(一)先理解 “页表” 是什么?
你可以把计算机的内存想象成一个巨大的图书馆,里面有无数本书(每个 “书” 就是一个内存页,通常 4KB 大小)。
页表就像是这个图书馆的 “目录本”,每一页目录记录了一本书的位置和属性:
- 比如 “《Linux 入门》在 3 楼 A 区第 5 号书架”(这对应 “物理地址”)
- 旁边还有备注:“不外借”(对应 “标志位”,比如 “只读” 属性)
- 目录本的结构决定了能管理多大的图书馆,以及能记录多少种备注信息。
(二)PAE 页表:给 32 位系统的 “超大图书馆扩建方案”
传统 32 位系统(非 PAE)的目录本有个限制:
- 物理地址只能用 20 位(类似只能记录 “1-5 楼” 的位置),最多管理 4GB 内存(2^20 × 4KB = 4GB)。
- 标志位只有 11 个(类似只能记录 “是否外借”“是否破损” 等简单备注)。
但现实中,图书馆可能有几十层楼(比如需要管理 64GB 内存),备注也需要更详细(比如 “是否允许 CPU 缓存”“是否属于内核”)。这时候就需要 PAE(Physical Address Extension,物理地址扩展)来升级目录本:
- 24 个物理地址位:相当于把 “书架位置” 的编号从 20 位升级到 24 位(实际 PAE 支持 36 位,但早期设计中页表项里存 24 位,后续通过分段扩展)。举个例子:
- 传统目录本:地址是 “5 位楼层 + 15 位书架号”(共 20 位),只能到 5 楼。
- PAE 目录本:地址是 “8 位楼层 + 16 位书架号”(共 24 位),能到 256 楼,管理的内存变成 2^24 × 4KB = 16GB(实际 PAE 通过三级分页支持到 64GB,这里简化理解)。
- 12 个标志位:相当于新增了 1 个备注栏,比如:
- “D” 位(脏页标志):这本书被修改过还没存档(对应内存页数据未写入硬盘)。
- “G” 位(全局页标志):所有程序都能访问这个公共书架(对应 CPU 缓存全局有效)。
- “PAT” 位(页面属性表):给书架分类(比如 “高速访问区”“低速存储区”)。
这 12 个标志位就像目录里的 12 个小标签,告诉 CPU 和操作系统如何处理这个内存页。
(三)一句话记住:
PAE 页表就像一本 “超级目录”,能记录 24 位的详细书架位置(物理地址),还带 12 个智能标签(标志位),让 32 位系统能管理更大的内存,还能精细控制每一页的权限和属性。