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):硬件自动遍历内存中的页表,完成地址转换。
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 和进程级隔离 |
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 |
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 |