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) 高性能计算、大页服务器
实战提示: 在嵌入式系统中,默认使用 4KB 粒度以兼容 Linux 内核的页缓存机制。若设备需要大量连续 DMA 缓冲区,可考虑使用 2MB 或 1GB 块映射(块条目),以减少页表遍历次数。

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 (有效位)
注意: 当 Valid 位为 0 时,访问该页表条目将触发 Translation Fault。在 DMA 映射调试中,检查 PTE 的 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。
架构优势: 这种设计允许内核在切换进程时只需切换 TTBR0(用户空间页表),而 TTBR1(内核空间页表)保持不变,从而避免 TLB 刷新,提升上下文切换性能。

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 配置变更
性能关键: 在 SMMU 场景中,设备 I/O 页表也使用类似的 ASID 机制(称为 PASID)。合理利用 ASID 可以减少 DMA 映射切换时的 TLB 刷新开销,提升吞吐量。

2.4 地址转换流程 SVG 图

下图展示了 ARMv8-A MMU 从虚拟地址到物理地址的完整转换流程,包括 TTBR 选择、页表遍历和最终物理地址生成:

ARMv8-A MMU 地址转换流程 ARMv8-A MMU 地址转换流程 虚拟地址 (VA) VA[47]? TTBR0 (用户空间) TTBR1 (内核空间) 4 级页表遍历 物理地址 (PA) 说明:VA[47] 决定使用 TTBR0 或 TTBR1;页表遍历根据粒度(4KB/16KB/64KB) 逐级查找,最终生成物理地址。ASID 在 TTBR0 中携带,用于 TLB 标记。

2.5 页表层级与块映射

ARMv8-A 页表支持 块映射,允许在中间层级直接映射大块内存,减少页表层级深度。以 4KB 粒度为例:

  • L0 页表:覆盖 512GB 区域,每个条目指向 L1 页表。
  • L1 页表:覆盖 1GB 区域,条目可以是块映射(1GB)或指向 L2 页表。
  • L2 页表:覆盖 2MB 区域,条目可以是块映射(2MB)或指向 L3 页表。
  • L3 页表:覆盖 4KB 区域,条目为页映射(4KB)。
DMA 映射优化: 当设备需要映射大块连续物理内存(如帧缓冲、网络包缓冲区)时,使用 L1 或 L2 块映射可以显著减少页表条目数量,降低 TLB 未命中率。在 SMMU 配置中,同样支持块映射,需注意设备地址宽度是否匹配。

2.6 本章小结

ARMv8-A MMU 通过灵活的页表格式、多级转换粒度和 TTBR0/TTBR1 分离设计,为操作系统提供了高效、安全的地址转换能力。ASID 机制进一步优化了多进程场景下的 TLB 性能。这些概念是理解后续 SMMU 配置和 DMA 映射调试的基石。