2. ARMv8-A 架构 MMU:页表格式、转换粒度、TTBR0/TTBR1、ASID 机制
ARMv8-A 架构的 MMU 是系统内存管理的中枢,负责将虚拟地址(VA)转换为物理地址(PA)。本章深入剖析其核心组件:页表格式、转换粒度、基址寄存器(TTBR0/TTBR1)以及地址空间标识符(ASID)机制。理解这些是配置 SMMU 和调试 DMA 映射问题的基础。
2.1 页表格式与转换粒度
ARMv8-A 使用基于 4 级页表 的查找机制(支持 3 级或 2 级配置),每一级页表条目(PTE)指向下一级页表或最终的物理页面。转换粒度决定了页表层级和映射效率。
2.1.1 支持的转换粒度
| 粒度 | 页面大小 | 最大地址空间 | 典型应用场景 |
|---|---|---|---|
| 4KB | 4KB / 2MB / 1GB | 48-bit (256 TB) | 通用 Linux 内核,内存碎片化场景 |
| 16KB | 16KB / 32MB / 64GB | 48-bit (256 TB) | 特定移动 SoC,减少 TLB 压力 |
| 64KB | 64KB / 512MB / 4TB | 52-bit (4 PB) | 高性能计算、大页服务器 |
2.1.2 页表条目(PTE)格式
每个 PTE 为 8 字节(64-bit),包含物理地址高位、属性位和权限位。以下是一个典型的 4KB 粒度下的 PTE 结构:
Bit [63:48] : 物理地址高位 (PA[47:32])
Bit [47:12] : 物理地址低位 (PA[31:12]),4KB 对齐
Bit [11:10] : AP[2:1] (访问权限)
Bit [9] : SH (可共享性)
Bit [8] : AF (访问标志)
Bit [7:6] : AttrIndx[1:0] (内存属性索引)
Bit [5] : NS (非安全)
Bit [4] : 0 (保留)
Bit [3] : PXN (特权执行永不)
Bit [2] : XN (执行永不)
Bit [1] : 0 (保留)
Bit [0] : Valid (有效位)
2.2 转换基址寄存器:TTBR0 与 TTBR1
ARMv8-A 提供两个独立的转换基址寄存器,用于管理不同的地址空间:
- TTBR0:用于用户空间(EL0)和内核空间低地址区域(通常为 0x0000_0000_0000_0000 - 0x0000_FFFF_FFFF_FFFF)。
- TTBR1:用于内核空间高地址区域(通常为 0xFFFF_0000_0000_0000 - 0xFFFF_FFFF_FFFF_FFFF)。
MMU 通过检查虚拟地址的最高有效位(VA[47] 或 VA[48])来决定使用哪个 TTBR:
- 若 VA[47] == 0,使用 TTBR0。
- 若 VA[47] == 1,使用 TTBR1。
2.3 ASID 机制
ASID(Address Space Identifier)用于区分不同进程的 TLB 条目,避免在进程切换时完全刷新 TLB。ARMv8-A 支持 8-bit 或 16-bit ASID。
2.3.1 ASID 分配与切换
Linux 内核为每个进程分配一个唯一的 ASID。当进程切换时,MMU 将新进程的 ASID 写入 TTBR0_EL1 的 ASID 字段(低 8 或 16 位)。TLB 条目同时标记 VA 和 ASID,只有匹配的 ASID 才能命中。
// 伪代码:进程切换时更新 TTBR0
// 假设当前进程的页表基址为 pgd,ASID 为 asid
write_sysreg(pgd | asid, TTBR0_EL1);
isb(); // 指令同步屏障,确保 MMU 看到新值
2.3.2 ASID 与 TLB 管理
| 操作 | TLB 影响 | 典型触发场景 |
|---|---|---|
| 切换 TTBR0(不同 ASID) | 保留旧 ASID 的 TLB 条目 | 进程上下文切换 |
| TLB 失效(按 ASID) | 仅清除指定 ASID 的条目 | 进程退出或 munmap |
| TLB 失效(全部) | 清除所有 TLB 条目 | 内核页表修改、SMMU 配置变更 |
2.4 地址转换流程 SVG 图
下图展示了 ARMv8-A MMU 从虚拟地址到物理地址的完整转换流程,包括 TTBR 选择、页表遍历和最终物理地址生成:
2.5 页表层级与块映射
ARMv8-A 页表支持 块映射,允许在中间层级直接映射大块内存,减少页表层级深度。以 4KB 粒度为例:
- L0 页表:覆盖 512GB 区域,每个条目指向 L1 页表。
- L1 页表:覆盖 1GB 区域,条目可以是块映射(1GB)或指向 L2 页表。
- L2 页表:覆盖 2MB 区域,条目可以是块映射(2MB)或指向 L3 页表。
- L3 页表:覆盖 4KB 区域,条目为页映射(4KB)。
2.6 本章小结
ARMv8-A MMU 通过灵活的页表格式、多级转换粒度和 TTBR0/TTBR1 分离设计,为操作系统提供了高效、安全的地址转换能力。ASID 机制进一步优化了多进程场景下的 TLB 性能。这些概念是理解后续 SMMU 配置和 DMA 映射调试的基石。