2. 页表项基础结构:PTE 通用位域与描述符类型
页表项(Page Table Entry, PTE)是 MMU 进行地址转换和权限管控的最小数据单元。ARMv8-A 架构中,一个标准的 PTE 占用 8 字节(64 位),其位域布局决定了该描述符是无效还是有效,以及有效时对应的映射粒度(页、块或下一级表)。
核心原则:MMU 在遍历页表时,首先检查 PTE 的 bit[0](Valid 位)。若为 0,则直接判定为无效描述符,触发 Translation Fault;若为 1,则根据 bit[1] 区分表描述符与块/页描述符。
2.1 PTE 通用位域定义(64 位 ARMv8-A)
下表列出了 ARMv8-A 中通用 PTE 的位域布局(以 4KB 粒度、48 位物理地址为例):
| 位域范围 | 字段名称 | 功能描述 |
|---|---|---|
| [63:48] | Upper Attributes | PBHA、XN(执行权限)、Contiguous 等扩展属性 |
| [47:16] | Output Address [47:16] | 物理页帧号(PFN)或下一级页表基址的高 32 位 |
| [15:12] | Reserved / Hints | 保留位或硬件辅助提示位(如 Access Flag) |
| [11:10] | AP[2:1] | 数据访问权限(EL0/EL1 读写控制) |
| [9] | SH | 可共享性属性(Non-shareable / Outer / Inner) |
| [8:6] | AttrIndx[2:0] | 指向 MAIR 寄存器中的属性索引 |
| [5] | NS | 非安全空间标识(TrustZone) |
| [4:2] | Attr / Type | 描述符类型编码(见表 2.2) |
| [1] | Table / Page | 0 = 表描述符(下一级);1 = 页/块描述符 |
| [0] | Valid | 0 = 无效描述符;1 = 有效描述符 |
位域解读技巧:bit[1:0] 组合决定描述符类型——
00 无效、01 表描述符、11 页/块描述符。10 组合在 ARMv8-A 中为保留格式,触发 Fault。
2.2 描述符类型:页 / 块 / 表
根据 PTE 的 bit[1:0] 编码,MMU 将描述符分为三类:
- 表描述符(Table Descriptor):bit[1:0] = 01。指向下一级页表的基地址。仅在 L0、L1、L2 页表层级出现,用于构建多级页表树。
- 块描述符(Block Descriptor):bit[1:0] = 11。映射一个连续的大内存块(如 2MB 或 1GB),通常出现在 L1 或 L2 层级,用于节省页表空间。
- 页描述符(Page Descriptor):bit[1:0] = 11,且位于 L3 层级。映射一个 4KB(或 16KB/64KB)的物理页,是最终粒度的映射。
常见混淆点:页描述符与块描述符在 bit[1:0] 编码上完全相同(均为 11),MMU 通过页表层级区分二者。L3 层级遇到 11 视为页描述符,L0/L1/L2 层级遇到 11 视为块描述符。设计页表软件时必须确保层级与描述符类型匹配,否则产生 Level Mismatch Fault。
2.3 无效描述符与有效描述符
MMU 在遍历页表时,对每个 PTE 执行以下判定流程:
- 检查 Valid 位(bit[0]):若为 0,直接标记为无效描述符,MMU 停止遍历并产生 Translation Fault(Stage 1 或 Stage 2 缺页异常)。
- 检查 bit[1] 与层级一致性:若 Valid=1,MMU 进一步检查 bit[1] 是否与当前层级匹配(L0 必须为表描述符,L3 必须为页描述符,L1/L2 可为表或块)。
- 属性检查:若描述符有效且类型匹配,MMU 提取输出地址、权限、内存属性,进行最终访问控制判断。
无效描述符的典型场景:
- 未映射的虚拟地址区域(如栈底保护页、空洞)。
- 页表分配但 PTE 尚未写入(初始值为 0)。
- 热迁移或内存回收时临时清空 PTE 的 Valid 位。
有效描述符必须同时满足:Valid=1、bit[1] 与层级匹配、输出地址对齐到映射粒度(如 4KB 页描述符的地址低 12 位必须为 0)。
2.4 描述符类型对比总结
| 特性 | 表描述符 | 块描述符 | 页描述符 |
|---|---|---|---|
| bit[1:0] | 01 | 11 | 11 |
| 出现层级 | L0, L1, L2 | L1, L2 | L3 |
| 映射粒度 | N/A(指向下级表) | 2MB(L2)/ 1GB(L1) | 4KB(标准页) |
| 输出地址含义 | 下一级页表基址 | 物理块基址 | 物理页基址 |
| 页表树深度 | 减少一级 | 终止遍历 | 终止遍历 |
性能权衡:块描述符可以减少页表级数和 TLB 压力,但内存管理粒度较粗,适合大块连续映射(如内核线性映射、设备 MMIO)。页描述符提供 4KB 粒度,适合用户空间堆栈、文件映射等需要细粒度权限控制的场景。