1. SMMU架构概述与核心原理
SMMU(System Memory Management Unit)是ARM架构中实现IOMMU(Input/Output Memory Management Unit)功能的关键组件。与CPU端的MMU类似,SMMU为外设提供地址转换和内存访问控制服务,但其设计目标和工作机制有显著差异。
1.1 SMMU与MMU的异同
相同点:
- 都采用多级页表结构实现虚拟地址到物理地址的转换
- 支持基于权限位的访问控制(读/写/执行)
- 使用TLB缓存加速地址转换过程
不同点:
- 服务对象:MMU服务于CPU核心,SMMU服务于外设DMA请求
- 地址空间:MMU处理进程虚拟地址(VA),SMMU处理设备IO虚拟地址(IOVA)
- 上下文管理:SMMU通过StreamID区分设备上下文,MMU通过ASID区分进程
- 错误处理:SMMU需处理设备发起的非法访问,MMU处理CPU的非法访问
关键提示:SMMU的StreamID相当于MMU的ASID,但命名空间独立。一个设备可能有多个StreamID(如支持PASID的设备),但一个StreamID只对应一个转换上下文。
1.2 SMMU核心组件解析
SMMUv3架构包含以下关键组件:
-
转换配置缓存(CD/Context Descriptor)
- 存储每个StreamID的页表基地址、ASID等配置
- 支持两阶段转换配置(Stage1+Stage2)
-
转换数据缓存(TLB)
- 缓存最近使用的地址转换结果
- 支持ASID和VMID标签隔离不同地址空间
-
命令队列(CMDQ)
- 用于软件向SMMU发送TLB失效等命令
- 支持环形缓冲区和门铃机制
-
事件队列(EVTQ)
- 报告转换错误等事件给软件
- 包含详细的错误地址和访问属性
-
PRI队列(仅PCIe设备)
- 处理PCIe页请求接口(Page Request Interface)
- 支持用户态驱动的按需分页
1.3 两阶段地址转换机制
SMMU支持灵活的两阶段地址转换:
- Stage1:IOVA→IPA(Intermediate Physical Address)
- 类似CPU的VA→PA转换
- 用于用户态驱动或虚拟机内驱动
- Stage2:IPA→PA(Physical Address)
- 类似CPU的第二阶段转换
- 用于虚拟机设备隔离
两阶段可组合使用(嵌套转换)或单独使用。Linux内核中常见配置:
bash复制# 单Stage1配置(用户态驱动)
echo "smmu.v3.stage1=1" > /sys/kernel/debug/smmu/options
# 单Stage2配置(虚拟机直通)
echo "smmu.v3.stage2=1" > /sys/kernel/debug/smmu/options
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
