smmu相关
主要结构
ARM SMMU 主要由
TBU(Translation Buffer Unit,转换缓冲单元 )
- TBU 中包含了 TLB(Translation Lookaside Buffer,转换后备缓冲器 ),主要负责缓存地址转换结果,从而加快地址转换的速度
TCU(Translation Context Unit,转换上下文单元 )
- TCU 则负责缓存地址翻译相关的上下文信息,确保不同的虚拟地址可以正确映射到物理地址。它就像是一个 “管家”,管理着地址空间的上下文信息,协调着整个地址转换的过程。在地址转换过程中,TCU 会根据不同的请求,提供相应的上下文信息,告诉 TBU 如何进行地址转换。例如,在多设备同时进行 DMA 操作的场景下,每个设备都有自己的地址空间和映射关系,TCU 会为每个设备维护独立的上下文信息,使得 TBU 能够准确地将每个设备的虚拟地址转换为正确的物理地址,避免了不同设备之间地址映射的混淆 。
一个 TCU 可以对应多个 TBU,这样的设计可以更好地满足系统中不同设备对地址转换速度和上下文管理的需求
数据结构
- StreamID(流标识符)是 SMMU 中用于区分不同设备或设备流的重要标识。
- 在一个复杂的系统中,可能存在多个设备同时进行 DMA 操作,每个设备都需要独立的地址转换和内存访问管理,StreamID 就像是每个设备的 “身份证”,通过它可以唯一地标识一个设备或设备流。
- 例如,在一个服务器系统中,可能同时连接着网卡、硬盘、GPU 等多个设备,每个设备在进行 DMA 操作时,都会携带自己的 StreamID,SMMU 根据这个 StreamID 来确定该设备的地址转换规则和上下文信息
- STE Table(流表项表)则是与 StreamID 密切相关的数据结构,用于存储与每个 StreamID 对应的配置信息和转换表指针。它主要有两种格式:Linear Stream Table(线性流表 )和 2-level Stream Table(两级流表 )
- Linear Stream Table 是一个连续的 STE 数组,从 0 开始,由 StreamID 作为索引进行查找。
- 这种查找方式非常简单直接,就像在一个按编号排列的书架上找书,只要知道书的编号(StreamID),就可以直接找到对应的位置(STE)。
- 例如,当 StreamID 为 5 时,就可以直接在数组的第 5 个位置找到对应的 STE。
- 缺点是当平台上外设较少时,会浪费大量连续的内存空间,因为即使某些位置对应的设备不存在,这些空间也会被占用
- 2-level Stream Table 则类似于 MMU 的页表结构,包含两级表。
- 第一级表(STD,Stream Table Directory )通过 StreamID 的高位部分进行索引,得到一个指向第二级表的指针;
- 第二级表是一个线性的 STE 数组,通过 StreamID 的低位部分进行索引,最终找到对应的 STE。
- 例如,假设 StreamID 是 16 位,其中高 8 位用于索引第一级表,低 8 位用于索引第二级表。当 StreamID 为 0x1234 时,首先用高 8 位 0x12 在第一级表中查找,找到一个指向第二级表的指针,然后用低 8 位 0x34 在第二级表中查找,最终找到对应的 STE。
- 这种结构的优点是更加节省内存空间,因为它不需要连续的内存来存储所有的 STE,只有在实际使用的位置才会分配内存;缺点是查找过程相对复杂,需要进行两次索引操作 。
- Linear Stream Table 是一个连续的 STE 数组,从 0 开始,由 StreamID 作为索引进行查找。
- Context Descriptor table(上下文描述符表,简称 CD 表 )在 SMMU 的地址转换过程中也起着关键作用。
- 它与 STE 密切相关,每个 STE 都包含一个指向 CD 表的指针。
- CD 表主要用于控制 Stage 1 的地址转换规则,包含了 Stage 1 页表基地址(S1TTB)、Stage 1 转换格式(如 AArch64 或 AArch32 )、权限控制(读写、执行权限等 )、缓存策略(inner/outer cacheability,即内 / 外缓存策略 )以及安全状态(Secure/Non-Secure,安全域或非安全域 )等重要信息
- 在地址转换过程中,当 SMMU 根据 StreamID 找到对应的 STE 后,会通过 STE 中的指针找到相应的 CD 表。然后,根据 CD 表中的信息,SMMU 可以确定 Stage 1 地址转换的具体规则和参数。
- 例如,CD 表中的 Stage 1 页表基地址(S1TTB)会告诉 SMMU 从哪里开始查找 Stage 1 的页表,从而进行虚拟地址到中间物理地址(IPA)的转换。而权限控制信息则会检查设备对目标内存区域的访问权限,如果设备没有相应的权限,SMMU 会阻止这次访问,保障了系统的安全性
- 在一些情况下,还会引入 SubstreamID(子流标识符 )来进一步区分和管理地址转换。SubstreamID 可以用于区分来自同一逻辑块但去往不同程序地址空间的请求,它等同于 PCIE 里的 PASID(Process Address Space ID,进程地址空间标识符 ),只是为了适应非 PCIE 系统,采用了更通用的名字。SMMU 会根据 SubstreamID 在 CD 表中进行进一步的查找和匹配,以确定最终的地址转换规则。例如,在一个具有多个上下文的计算加速器中,每个上下文可能映射到不同的用户进程,但它们共享同一个设备和通用配置,这时就可以通过 SubstreamID 来区分不同上下文的地址转换请求,确保每个上下文都能正确地访问到自己的地址空间 。
TCU和TBU对应这SMMU哪一级?
- TCU/TBU 不是"翻译的某一级",而是硬件实现的拆分层级,和 Stage-1/Stage-2 是两个维度
| 维度 | 概念 | 含义 |
|---|---|---|
| 翻译阶段(纵向) | Stage-1 / Stage-2 | 做几层地址翻译:S1=VA→IPA,S2=IPA→PA |
| 硬件实现(横向/物理) | TCU / TBU | SMMU 这块硅片在物理上由哪些块组成,谁做缓存、谁做页表遍历 |
所以:
TCU ≈ 架构级 = 软件看到的"SMMU 本体":软件编程模型里的命令/事件/PRI 队列、流表/STE、全局寄存器全都住在 TCU 上。从软件角度,面对的就是 TCU。
TBU ≈ 微架构/硬件实现级 = 贴设备的翻译加速器:内含 micro-TLB,贴近主设备做本地缓存,对软件完全透明、不可编程。
关键:TBU 和 TCU 都同时参与 Stage-1 和 Stage-2 的翻译——TBU 的 micro-TLB 缓存 S1/S2 两级结果,TCU 的 macro-TLB + PTW 遍历 S1/S2 两级页表。**不存在"TBU 只做 S1、TCU 只做 S2"这种对应关系。
SMMU arch spec中编程模型那一大章(队列、寄存器、STE)描述的就是 TCU;TBU 只在架构概览 / DTI 相关地方作为"可选的硬件分解"出现,对软件不可见。所以从软件角度:SMMU ≈ TCU;TBU 只是贴设备、藏在硬件里的 micro-TLB 加速器。