1. 课程导入
各位同学,咱们今天正式开讲 SMMU。说实话,我第一次接触 SMMU 是在一个 PCIe 加速卡的项目里。当时系统总是不定期挂死,我查了整整两周,最后发现是 DMA 写错了物理地址,直接把内核数据踩坏了。那时候我就想——要是有一个硬件模块能帮设备做地址翻译和权限检查,该多好?嗯,SMMU 就是干这个的。
1.1 什么是 SMMU?
SMMU,全称 System Memory Management Unit,系统内存管理单元。你把它理解成“专门给设备用的 MMU”就行了。
CPU 有 MMU,把虚拟地址翻译成物理地址,还能做权限保护。那 DMA 控制器、GPU、网卡、存储控制器这些设备呢?它们直接访问物理内存,没有翻译,没有保护。这就带来了三个问题:
- 安全问题:设备可以读写任意物理地址,包括操作系统保护的内存区域
- 地址空间碎片化:设备需要连续的物理缓冲区,但系统运行久了很难分配大块连续内存
- 虚拟化困境:虚拟机里的设备驱动直接操作 GPA(客户物理地址),没有 SMMU 根本没法做设备直通
SMMU 就站在设备和内存总线之间,拦截设备发起的内存访问请求,做地址翻译和权限检查。说白了,它让设备也能用“虚拟地址”访问内存。
核心定义:SMMU 是一个硬件模块,负责将设备发起的 I/O 虚拟地址(IOVA)翻译为系统物理地址(PA),并执行访问权限检查。
1.2 为什么需要 SMMU?
我直接说三个我在项目中遇到过的真实场景,你就明白了。
场景一:安全隔离
有一次做车载芯片,多个传感器通过 DMA 往内存写数据。如果没有 SMMU,一个恶意或被破坏的传感器驱动可以 DMA 到别的传感器缓冲区,甚至写到系统关键数据区。有了 SMMU,每个设备只能访问它被授权的 IOVA 范围,越界访问直接触发异常。
场景二:大块连续内存
GPU 驱动经常要分配几百 MB 的连续缓冲区。系统跑久了,物理内存碎片化严重,分配失败。用 SMMU 之后,驱动只需要分配离散的物理页,然后通过 SMMU 页表把它们映射成连续的 IOVA 空间。设备看到的是连续地址,底层物理页是离散的。这个技巧我在视频编解码项目里用过很多次。
场景三:设备直通虚拟化
虚拟化场景下,宿主机把物理设备直通给虚拟机。虚拟机里的驱动发 DMA 时用的是 GPA。SMMU 做 GPA→HPA 的翻译,同时保证不同 VM 之间的地址空间隔离。没有 SMMU,设备直通基本不可能安全实现。
| 对比项 | 无 SMMU | 有 SMMU |
|---|---|---|
| 地址翻译 | 设备直接使用物理地址 | 设备使用 IOVA,SMMU 翻译为 PA |
| 安全隔离 | 设备可访问任意物理内存 | 按页表权限严格隔离 |
| 内存连续性 | 需要物理连续缓冲区 | 离散物理页可映射为连续 IOVA |
| 虚拟化支持 | 无法安全直通设备 | 支持 GPA→HPA 二级翻译 |
1.3 SMMU 在 SoC 中的位置
咱们来看一张结构图。这张图我画了很多次,每次给新同事讲 SMMU 都会先画它。
从这张图你能看到:
- 设备端:GPU、网卡、存储控制器、视频编解码器等,它们内部有 DMA 引擎,发起内存访问时用的是 IOVA
- SMMU 位于设备和总线之间:所有设备的内存访问请求必须先经过 SMMU。SMMU 查页表做翻译,命中 TLB 就快,没命中就走页表 walk
- 翻译完成后:物理地址通过系统总线发往内存控制器,最终读写 DDR
- CPU 路径是独立的:CPU 走自己的 MMU,不经过 SMMU。两条路径在系统总线汇合
个人经验:调试 SMMU 问题时,我习惯先确认设备发出来的地址是 IOVA 还是已经翻译过的物理地址。很多坑都是因为设备驱动和 SMMU 配置不一致导致的。比如驱动以为 SMMU 在做翻译,实际上 SMMU 被配置成了 bypass 模式——那设备直接拿物理地址访问,页表配置全白费。
1.4 SMMU 的两种工作模式
嗯,这里要重点说一下。SMMU 有两种基本模式,你在实际项目中一定会遇到:
| 模式 | 说明 | 典型场景 |
|---|---|---|
| Bypass 模式 | SMMU 不翻译,设备地址直接透传 | 系统启动阶段、不需要地址翻译的简单设备 |
| 翻译模式 | SMMU 按页表做 IOVA→PA 翻译 | 虚拟化、安全隔离、大块连续内存需求 |
避坑指南:我曾经在一个项目里发现设备 DMA 偶尔失败,查了三天。最后发现是 SMMU 在运行过程中被意外切换到了 bypass 模式,而设备驱动还在按翻译模式配置页表。SMMU 模式切换必须保证设备处于 quiescent 状态,否则后果很严重。
1.5 小结
这一节我们讲了 SMMU 最基础的东西:
- SMMU 是设备的 MMU,做 IOVA→PA 翻译和权限检查
- 它解决安全隔离、内存连续性、虚拟化设备直通三大问题
- 在 SoC 中位于设备和系统总线之间,所有设备 DMA 必经之路
- 有 bypass 和翻译两种工作模式,切换要小心
这些概念是后面所有调试和故障定位的基础。你先把这张图印在脑子里,后面讲 TLB 结构、缓存一致性协议、页表 walk 流程的时候,我们才能聊到点子上。