为什么PAE页表项必须包含12个标志位和24个物理地址位

第一章 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+122+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 位)依次为:

      1. P(Present):0 表示该页不在物理内存中(触发缺页中断)。
      2. RW(Read/Write):0 为只读,1 为可写(用户空间写只读页会触发保护错误)。
      3. U/S(User/Supervisor):0 为内核级访问,1 为用户级可访问。
      4. PWT(Page-level Write-Through):0 为回写缓存,1 为直写缓存(控制 CPU 缓存策略)。
      5. PCD(Page-level Cache Disable):1 禁止 CPU 缓存该页(用于设备内存映射)。
      6. A(Accessed):CPU 访问该页时自动置 1(操作系统统计使用情况)。
      7. D(Dirty):写操作时置 1(页面换出时需写入磁盘)。
      8. PAT(Page Attribute Table):启用页面属性表(配合 CR4.PAT 标志,定义缓存策略)。
      9. G(Global):1 表示全局页(TLB 缓存不随进程切换刷新,提升性能)。
      10. 保留位(位 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 页表操作流程(以虚拟地址转换为例)
  1. CPU 读取 CR3 寄存器,获取 Page Directory Pointer Table 基址。
  2. 用虚拟地址的高 2 位索引 PDPTE,检查 P 位:
    • P=0:触发缺页中断(内核分配物理页并填充页表)。
    • P=1:获取页目录基址(PDPTE 中的 24 位地址左移 12 位)。
  3. 用虚拟地址的中间 9 位索引 PDE,同样检查 P 位,获取页表基址。
  4. 用虚拟地址的下一个 9 位索引 PTE,获取物理页基址(24 位地址左移 12 位)。
  5. 加上页内偏移,得到最终物理地址。
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 架构向大内存时代的过渡方案,其页表设计的两大创新点:

  1. 24 位物理地址存储:通过 64 位页表项,突破传统 20 位限制,支持 36 位物理地址(64GB),满足服务器对大内存的需求。
  2. 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,物理地址扩展)来升级目录本:

  1. 24 个物理地址位:相当于把 “书架位置” 的编号从 20 位升级到 24 位(实际 PAE 支持 36 位,但早期设计中页表项里存 24 位,后续通过分段扩展)。举个例子:
    • 传统目录本:地址是 “5 位楼层 + 15 位书架号”(共 20 位),只能到 5 楼。
    • PAE 目录本:地址是 “8 位楼层 + 16 位书架号”(共 24 位),能到 256 楼,管理的内存变成 2^24 × 4KB = 16GB(实际 PAE 通过三级分页支持到 64GB,这里简化理解)。
  2. 12 个标志位:相当于新增了 1 个备注栏,比如:
    • “D” 位(脏页标志):这本书被修改过还没存档(对应内存页数据未写入硬盘)。
    • “G” 位(全局页标志):所有程序都能访问这个公共书架(对应 CPU 缓存全局有效)。
    • “PAT” 位(页面属性表):给书架分类(比如 “高速访问区”“低速存储区”)。
      这 12 个标志位就像目录里的 12 个小标签,告诉 CPU 和操作系统如何处理这个内存页。
(三)一句话记住:

PAE 页表就像一本 “超级目录”,能记录 24 位的详细书架位置(物理地址),还带 12 个智能标签(标志位),让 32 位系统能管理更大的内存,还能精细控制每一页的权限和属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值