资讯动态

ARM SMMU 核心原理与实战:从多 Master 翻译到安全隔离

发布时间:2026/10/29 16:57:14 来源:尧图企业网站定制
简介面向嵌入式、芯片与 SOC 底层开发者的 SMMU 系统学习资料围绕 ARM 架构下 System MMU 的定位与用途展开适合具备一定 MMU、页表与虚拟化基础、希望系统梳理 SMMU 知识体系的中高级读者。内容从 SMMU 的发展脉络与基本概念切入覆盖非连续地址映射、32 位 Master 访问 64 位地址空间、Master 访问权限限制、用户态驱动安全隔离以及设备虚拟化等典型使用场景并进一步讲解 TBU 与 TCU 硬件组成、StreamID、STE 表结构、多级 Stream Table 与 Context Descriptor、两级地址翻译流程及安全与非安全寄存器差异帮助读者建立从使用模型到硬件原理的完整认知。资源包共 1 个文件为 1 份 PDF 文档大小约 1.53MB便于离线阅读与查阅。已有 252 人学习适合作为 ARMv9、TrustZone 与 SOC 底层安全方向的自学参考。1. SMMU 知识地图从“给设备用的 MMU”切入很多人第一次接触 SMMU会把它当成 MMU 的附属品背完 STE、CD 表就以为掌握了。真正梳理下来会发现SMMU 的难点不在“页表怎么走”而在“多个 Master 怎么共用一套翻译体系”。MMU 服务一个 Core页表基址放在寄存器里就够了SMMU 要服务 DMA、VPU、DPU 等一堆 Master每个 Master 的地址空间、安全属性、翻译阶段都可能不同于是才有了 StreamID、STE Table、Context Descriptor 这一整套索引结构。这份笔记围绕 ARM SMMU含 mmu500、mmu600、mmu700 几代展开把使用场景、硬件组成、两级索引、寄存器双视图和安全属性串成一条线适合正在系统学 ARMv8/ARMv9 内存管理与 TEE 安全方向的人拿来对照复习。2. 为什么需要 SMMU五类场景与 Master 侧地址问题2.1 从“非连续地址”到“32 位转 64 位”SMMU 全称 System Memory Management Units属于 Arm 的 System IP主要给 Core 以外的 Master 使用。它和 Core MMU 最关键的共同点是页表格式一致理论上 Core MMU 和 SMMU 可以共用同一套页表。理解这一点后面所有结构都能对上号。系统里很少再预留大块连续内存Master 需要多块内存时SMMU 可以把非连续的物理地址映射成连续的虚拟地址给 DMA、VPU、DPU 使用。另一个高频场景是位宽转换系统是 64 位但部分 Master 仍是 32 位只能访问低 4GB通过 SMMU 把 Master 发出的 32 位地址转换成 64 位访问高地址空间就顺了。2.2 访问过滤、用户态驱动与设备虚拟化Master 理论上能访问全部地址空间SMMU 可以对访问做过滤只放行受限区域而这个区域由 CPU 在建立页表时动态控制。用户态驱动场景下驱动不再切内核态用户态直接控制设备存在越权访问内核空间的风险SMMU 正好用来限制设备的访问范围。设备虚拟化有 Emulate、Para-virtualized、Pass-through 几种方式用 SMMU 可以实现 Pass-through性能和软件改动都较小。还有一点容易被忽略一些不支持 TrustZone 的 Master可以借助 SMMU 获得 TrustZone 能力。梳理下来会发现这五类场景其实对应同一个本质——把 Master 的访问纳入可编程的地址翻译与权限检查。场景核心诉求SMMU 的作用点非连续地址多块分散内存非连续 PA 映射为连续 VA32 位转 64 位突破 4GB 限制地址位宽扩展访问空间限制最小权限页表级区域过滤用户态驱动隔离内核空间限制设备可访问范围设备虚拟化Pass-through直通下的地址隔离提示这五类场景是回答“为什么要用 SMMU”的标准答案复习时按“诉求—作用点”成对记忆比单背名词稳。3. 硬件组成与索引结构TBU、TCU、StreamID 到 STE3.1 TBU TCU 的硬件分工学过 MMU 的人知道它由 TLB 加地址翻译组成SMMU 的结构则是 TBU 加 TCU。TBU 中含有 TLB负责发起翻译请求TCU 负责缓存地址翻译结果DTI 是 SMMU 内部的连接总线协议。一个 SMMU 里可以放置多个 ACE-Lite TBU也可以放置 LTI TBU不同 TBU 对应不同总线形态的 Master。这里的关键认知是TBU 是“入口”TCU 是“翻译与缓存中枢”。多个 Master 从各自 TBU 进来最终在 TCU 侧共享翻译缓存这也是 SMMU 能服务多 Master 的硬件基础。3.2 StreamID 与两级 Stream Table每个 Master 的请求带一个 StreamIDSMMU 用它索引 STE Table。STE Table 分 Linear Stream Table 和 Multi-level Stream Table由 STRTAB_BASE_CFG 中的比特位配置决定。Linear 方式很直接按 StreamID 数值直接查到对应 STEMulti-level 方式则先查一级表再查二级表适合 StreamID 空间大但实际使用稀疏的场景。# 概念示意STRTAB_BASE_CFG 的配置位决定查表方式 # 具体位域以对应版本手册为准这里只表达“配置决定结构”这一层 STRTAB_BASE_CFG: LOG2SIZE - 表大小以 2 的幂表示 SPLIT - 线性表 / 两级表的选择上面这段不是可直接烧写的寄存器值而是提醒你查表方式不是写死的先看 STRTAB_BASE_CFG 再决定按线性还是两级去理解地址计算。复习时最容易翻车的地方就是拿线性表的公式去套两级表。3.3 STE 与 Context Descriptor 的对应关系一个 STE 又可以对应多个 Context Descriptor。这里有个很好用的类比一个 Context Descriptor 相当于 MMU 系统中的 TTBRx 加 TCR 寄存器而 Stage 1 翻译页表的格式和 MMU 页表格式一致。地址翻译同样分 Stage 1 和 Stage 2和 MMU 一致。于是整条索引链是StreamID → STE → 多个 CD → 页表。Configuration and translation lookup sequence 那张图之所以看着比 MMU 复杂就是多了前面两级索引。把这条链背成一句话比死记图更管用。层级作用对应 MMU 概念StreamID标识发起请求的 Master无直接对应STE每个 Master 的翻译配置入口类似“每 Master 一套配置”Context Descriptor一套翻译上下文TTBRx TCRStage 1/2 页表实际地址翻译与 MMU 页表格式一致注意CD 数量在实际系统里往往只用到一个但结构上必须按“一个 STE 可挂多个 CD”来理解否则遇到多上下文配置会读不懂。4. 寄存器双视图与安全属性S 与非 S 的两套世界4.1 memory-map 的两套寄存器SMMU 寄存器都是 memory-map 的并且有两套一套给安全 Master 用一套给非安全 Master 用。硬件上只有一块 SMMU但从软件视角看相当于有两个 SMMU。典型例子是 SMMU_STRTAB_BASE 与 SMMU_S_STRTAB_BASE、SMMU_STRTAB_BASE_CFG 与 SMMU_S_STRTAB_BASE_CFG。这里有个高频误解这不是 banked 寄存器。banked 是同一名字按当前安全状态切换而 SMMU 这两套寄存器名字不同一类带 S一类不带 Smemory-map 地址也不一样。复习时把“名字不同、地址不同、非 banked”这三点一起记能避开大多数概念题。4.2 Secure STE 与 Non-secure STE 的翻译边界SMMU 还有 Secure STE 和 Non-secure STE 的概念。Secure STE 后面的页表与地址转换可以转 secure memory也可以转 non-secure memoryNon-secure STE 后面的转换只可以转 non-secure memory。这和 MMU 描述符里的 NS 比特是同一套思路。把这条边界和前面的双寄存器视图合起来看安全侧的翻译能力是“超集”非安全侧是“子集”。在 TEE、ATF/TF-A、TrustZone 相关系统里这条边界直接决定设备能不能碰到受保护内存属于必须吃透的点。/* 伪代码表达安全属性对翻译目标的影响非真实寄存器操作 */ if (ste_is_secure(ste)) { /* 可翻译到 secure 或 non-secure 内存 */ target translate(ste, addr); } else { /* 仅允许翻译到 non-secure 内存 */ target translate_ns_only(ste, addr); }这段伪代码只强调一件事安全属性不是翻译完成后再检查而是从 STE 选择那一刻就决定了可达范围。参数上重点关注 STE 的安全标志位它决定了后续页表能指向哪类内存。5. 易错点清单五个最容易翻车的认知易错点一把 SMMU 当成“第二个 MMU”孤立记忆。漏的原因是只背结构不背对应关系。补法是把 STE 对应“每 Master 配置”、CD 对应“TTBRx TCR”、Stage 1 页表对应“MMU 页表”做成一张对照表每次复习先过对照表。易错点二以为两套寄存器是 banked。漏的原因是看到“安全/非安全”就条件反射想到 banked。补法是记住名字带 S 与不带 S、地址不同这两个硬特征遇到判断题先看名字。易错点三用线性 Stream Table 的算法套两级表。漏的原因是没先看 STRTAB_BASE_CFG。补法是任何查表计算前先确认 SPLIT 配置位再选公式。易错点四忽略 Non-secure STE 不能转 secure memory。漏的原因是把安全属性当成“翻译后检查”。补法是把“Secure 是超集、Non-secure 是子集”写成一句话贴在笔记首页。易错点五只记 TBU 忘了 TCU 与 DTI。漏的原因是硬件图看得太快。补法是用“入口—中枢—内部总线”三个词复述硬件组成能复述出来才算过。提示这五条对应的是概念题和读图题的高发区考前用“易错点 → 正确说法”自问自答一遍比重新通读一遍正文效率高。6. 复习落地一张自检表加一个复述习惯把这份内容收成可执行的复习动作比再读一遍更有效。第一步用下面的自检表逐项打勾任何一项说不清就回到对应章节。第二步合上笔记用“StreamID → STE → CD → 页表”这条链把整个翻译流程口述一遍卡住的地方就是薄弱点。第三步把五类使用场景按“诉求—作用点”成对复述确保不是背名词而是讲逻辑。自检项能说清的标准对应章节五类使用场景每类能说出诉求与作用点第 2 章硬件组成能讲 TBU、TCU、DTI 分工第 3 章索引链StreamID 到页表一口气讲完第 3 章双寄存器视图说清非 banked 的两个硬特征第 4 章安全边界Secure 超集、Non-secure 子集第 4 章易错点五条能自问自答第 5 章我自己的习惯是每次复习前先不看正文拿这张表默讲一遍讲不顺的条目才翻回去看通常十分钟就能定位到漏洞。血泪经验是SMMU 的题很少考你背没背下来考的是你能不能把“多 Master 共用翻译体系”这条主线讲圆。从那以后我每次碰这类系统 IP都强制先画索引链再抠细节避免一上来就陷进寄存器位域里出不来。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑