2. ARM SMMU 基础:硬件架构与核心概念

ARM SMMU(System Memory Management Unit)是 ARM 架构下实现设备 DMA 地址转换与内存访问权限控制的关键硬件单元。它相当于为 I/O 设备配备的“MMU”,使得非 CPU 设备也能在虚拟化环境中安全、高效地访问系统内存。本章将深入剖析 SMMU 的硬件架构、StreamID、SubstreamID 以及 Context Bank 等核心概念。

2.1 SMMU 硬件架构概览

SMMU 位于 I/O 设备与系统互连(如 AMBA、AXI)之间,负责截获设备发起的事务请求,并执行地址转换与权限检查。其核心架构组件包括:

  • Stream ID (SID) 解析单元:负责从总线事务中提取 StreamID,并匹配对应的配置。
  • 配置缓存 (Configuration Cache):缓存 StreamID 到 Stream Table Entry (STE) 的映射关系,加速查找。
  • Stream Table (ST):内存中的表结构,每个 StreamID 对应一个 STE,定义了该流的转换策略和上下文指针。
  • Context Bank (CB):一组寄存器或内存区域,保存特定地址空间的页表基址、ASID、配置信息等。
  • TLB (Translation Lookaside Buffer):缓存最近使用的页表转换结果,减少对内存页表的访问。
  • 页表遍历单元 (Page Table Walker):硬件自动遍历内存中的页表,完成地址转换。
架构要点: SMMU 的设计哲学是“流式隔离”——每个 I/O 设备或虚拟功能通过唯一的 StreamID 标识,SMMU 根据 StreamID 查找对应的转换上下文,实现设备间的内存访问隔离。
SMMU 硬件架构框图 SMMU 硬件架构框图 I/O 设备 AXI/ACE SMMU 核心 SID 解析 配置缓存 Stream Table Context Bank TLB 页表遍历 系统内存 说明:设备通过总线发起事务,SMMU 解析 SID 后查找 Stream Table,获取 Context Bank 指针,进而执行页表转换和权限检查。

2.2 StreamID 与 SubstreamID

StreamID (SID) 是 SMMU 识别 I/O 事务来源的唯一标识符。每个发起 DMA 请求的设备或设备中的虚拟功能(VF)都被分配一个唯一的 StreamID。SMMU 根据 StreamID 查找对应的 Stream Table Entry (STE),从而确定该流使用的转换策略和上下文。

SubstreamID (SSID) 是 StreamID 的扩展,用于在同一个 StreamID 下进一步区分不同的地址空间或进程上下文。SSID 通常与 PCIe PASID (Process Address Space ID) 或 ARM 的 VMID/ASID 概念对应,是实现 细粒度共享虚拟内存 (SVM) 的关键。

概念 位宽(典型) 作用范围 典型用途
StreamID (SID) 16 bits 全局唯一,标识一个设备或 VF 区分不同物理/虚拟功能,绑定独立的转换策略
SubstreamID (SSID) 20 bits 在同一个 StreamID 内唯一 标识进程地址空间,支持 SVM 和进程级隔离
实践提示: 在虚拟化场景中,通常将每个 VM 的虚拟设备映射为一个独立的 StreamID,而 VM 内部的进程则通过 SubstreamID 区分。这种两级标识机制使得 SMMU 能够同时实现设备级和进程级的内存隔离。
StreamID 与 SubstreamID 映射关系 StreamID 与 SubstreamID 映射关系 物理设备 VF0 (SID=0x1) VF1 (SID=0x2) Stream Table SID 0x1 → STE1 SID 0x2 → STE2 ... SID 0xN → STEN Context Bank 实例 CB0 (ASID=0xA) CB1 (ASID=0xB) CB2 (ASID=0xC) CB3 (ASID=0xD) 说明:每个 VF 拥有独立的 StreamID,SMMU 通过 Stream Table 映射到对应的 Context Bank,Context Bank 保存页表基址和 ASID,实现地址空间隔离。

2.3 Context Bank 概念与作用

Context Bank (CB) 是 SMMU 中用于保存特定地址空间转换上下文的一组硬件资源。每个 Context Bank 通常包含以下关键信息:

  • 页表基址寄存器 (TTBR):指向该上下文使用的页表在内存中的起始地址。
  • 地址空间标识符 (ASID):用于区分不同的进程地址空间,配合 TLB 实现高效切换。
  • 转换控制寄存器 (TCR):配置页表层级、页面大小、内存属性等参数。
  • 故障状态寄存器 (FSR/FAR):记录地址转换失败时的状态和地址信息。

Context Bank 的数量是 SMMU 硬件实现时确定的,通常为 32、64 或 128 个。每个 StreamID 通过 STE 中的指针关联到一个 Context Bank,从而实现 StreamID 到地址空间的映射。

Context Bank 组件 功能描述 典型位宽
TTBR0/TTBR1 页表基址寄存器,支持 0 级和 1 级页表 64 bits
ASID 地址空间标识符,用于 TLB 标记 8/16 bits
TCR 转换控制寄存器,配置页表参数 32 bits
MAIR 内存属性寄存器,定义内存类型和缓存策略 64 bits
注意事项: Context Bank 是有限的硬件资源。在设计系统时,需要合理规划 StreamID 与 Context Bank 的映射关系。如果 Context Bank 耗尽,新的设备或虚拟功能将无法获得独立的地址转换上下文,可能导致系统功能受限或性能下降。
Context Bank 内部结构 Context Bank 内部结构 Context Bank (CB) TTBR0 (页表基址) ASID (地址空间ID) TCR (转换控制) MAIR (内存属性) FSR/FAR (故障状态) 页表 (内存) 说明:每个 Context Bank 包含一组寄存器,共同定义了一个独立的地址转换环境。TTBR 指向内存中的页表,ASID 用于 TLB 标记,TCR 控制转换参数。

2.4 核心概念总结

下表总结了 SMMU 基础概念之间的关系与作用:

概念 层级 核心作用 关联对象
StreamID 设备级 唯一标识 I/O 事务来源 物理设备、VF
SubstreamID 进程级 在 StreamID 内区分地址空间 进程、VM 内部 vCPU
Stream Table 全局表 StreamID → STE 映射 所有 StreamID
Context Bank 上下文 保存页表基址、ASID、控制寄存器 STE 指针引用
STE 流条目 定义流的转换策略和 Context Bank 指针 StreamID、Context Bank
设计要点: 在实际系统中,StreamID 的分配通常由系统固件或 hypervisor 完成。Context Bank 的数量直接决定了系统能够同时支持的独立地址空间数量,是 SMMU 硬件选型时的重要参数。SubstreamID 的引入使得 SMMU 能够支持更细粒度的进程级隔离,是 ARM 虚拟化中实现高效 I/O 虚拟化的关键特性。