ARM SMMU与Linux内核MMU设备地址空间隔离 - 第4节
4.1 SMMU 硬件架构概览
系统内存管理单元(SMMU)是 ARM 架构中负责设备 DMA 地址转换与访问控制的硬件单元。其核心设计遵循 TCU(Translation Control Unit) 与 TBU(Translation Buffer Unit) 分离的微架构思想,并引入 微页表缓存(Micro TLB / uTLB) 以降低多级页表遍历的延迟。
从系统视角看,SMMU 位于总线互连(如 AMBA ACE/CHI)与内存控制器之间,对来自 PCIe、GPU、Display、Network 等外设的 DMA 请求进行地址翻译和权限检查。下图展示了 SMMU 在 SoC 中的典型位置:
4.2 SMMU 核心组成模块
SMMU 硬件架构由三大核心模块构成:TBU(Translation Buffer Unit)、TCU(Translation Control Unit) 以及 微页表缓存(Micro TLB / uTLB)。三者协同完成从设备侧虚拟地址(或 IOVA)到物理地址的快速转换。
4.2.1 TBU(Translation Buffer Unit)
TBU 是靠近设备端的翻译缓冲单元,通常与特定接口或设备簇紧耦合。其主要职责包括:
- 接收设备 DMA 请求:从总线接口捕获设备发起的读写事务及其携带的地址。
- 缓存最近使用的页表转换条目:维护一个本地 TLB(Translation Lookaside Buffer),加速重复地址的翻译。
- 发起页表遍历请求:当本地 TLB 未命中时,向 TCU 发送页表遍历请求。
- 执行地址转换与权限检查:将设备 IOVA 转换为物理地址,并校验访问权限。
4.2.2 TCU(Translation Control Unit)
TCU 是 SMMU 的控制核心,负责全局翻译管理与配置。其关键功能包括:
- 管理页表基地址寄存器(TTBR):为每个 Stream(设备流)维护独立的页表根指针。
- 执行多级页表遍历(Walk):当 TBU 未命中时,TCU 通过硬件状态机遍历内存中的页表。
- 维护全局配置寄存器:如 SMMU_CRx、SMMU_SMRx、SMMU_CBARn 等。
- 处理异常与中断:当翻译错误或权限违规时,触发同步异常或记录错误日志。
- 协调多个 TBU 的一致性:通过广播无效化操作(TLBI)同步各 TBU 的缓存状态。
4.2.3 微页表缓存(Micro TLB / uTLB)
微页表缓存是位于 TCU 内部或紧邻 TCU 的一级页表条目缓存,专门缓存页表遍历过程中访问的中间级页表项(如 L1/L2 级描述符)。其作用在于:
- 减少页表遍历的内存访问次数:典型 4 级页表遍历需要 4 次内存读,微页表缓存命中后可跳过部分中间级访问。
- 降低翻译延迟:缓存命中时,翻译延迟可从数十纳秒降至数个时钟周期。
- 提升多 TBU 共享效率:多个 TBU 的页表遍历请求可共享 TCU 中的微页表缓存。
4.3 模块间交互流程
下图展示了 TBU、TCU 与微页表缓存之间的典型交互流程:
4.4 模块功能对比
下表从多个维度对比 TBU、TCU 与微页表缓存的核心差异:
| 对比维度 | TBU | TCU | 微页表缓存 |
|---|---|---|---|
| 物理位置 | 靠近设备接口 | SMMU 中央控制单元 | TCU 内部或紧邻 |
| 缓存内容 | 最终转换结果(PA + 属性) | 配置寄存器、Stream 映射表 | 中间级页表描述符 |
| 容量 | 小(32~128 条) | N/A(控制逻辑为主) | 中等(64~512 条) |
| 主要延迟 | 1~2 时钟周期(命中时) | 数十时钟周期(遍历时) | 2~4 时钟周期(命中时) |
| 无效化粒度 | 按地址范围或 ASID | 全局或按 Stream | 随 TCU 遍历状态自动失效 |
| 典型数量 | 多个(每个设备簇一个) | 单个(每个 SMMU 一个) | 单个(共享) |
4.5 硬件架构总结
SMMU 的 TBU + TCU + 微页表缓存三级架构,在面积、功耗与性能之间取得了良好平衡:
- TBU 提供低延迟的本地翻译缓存,减少对 TCU 的访问压力。
- TCU 集中管理页表遍历与配置,降低多 TBU 的硬件复杂度。
- 微页表缓存 作为中间级缓存,加速页表遍历过程,减少内存访问次数。
关键设计权衡: 在实际 SoC 设计中,TBU 的数量与容量取决于所连接设备的带宽和延迟要求;TCU 的页表遍历深度(支持 2~4 级页表)需与系统内存大小对齐;微页表缓存的容量则需平衡命中率与芯片面积。理解这三者的协同关系,是掌握 SMMU 性能调优的基础。