ARM SMMUv2架构下的安全和非安全状态(secure/non-secure)下的的资源分配解析
SMMU secure non-secure的资源分配
- 1 Secure与Non-secure域的资源共享
- 2 仅支持单一安全状态(non-secure)的SMMU
- 3 支持Secure与Non-secure两种安全状态的SMMU
- 3.1 资源分配(Resource allocation)
- 3.2 允许的事务资源访问(Permitted transaction resource usage)
- 3.3 可分配的资源类型
- **Stream Mapping Register Groups(流映射寄存器组)**
- **Context Banks**
- SMMU_CBA2Rn.VA64
- **Context Interrupts(上下文中断)**
- 3.4 资源分配的安全约束
- 4. 举例说明:访问和使用的区别
- 4.1 **Non-secure 可访问和使用的 Context Bank**
- 4.2 **Secure 可访问和使用的 Context Bank**
- 📌 总结表格
- 4.3 SMMU_IDR1.NUMS2CB,SMMU_IDR1.NUMCB,SMMU_SCR1.NSNUMCBO
- 5 什么是Non-secure pagetable
- 为什么有non-secure的page table?
1 Secure与Non-secure域的资源共享
- SMMU可以被设计为支持两种安全状态(可选特性),如果只有一种,那通常是non-secure。
- 如果支持,SMMU的资源(如Stream Mapping Register Groups、Context Banks等)会被Secure和Non-secure域共享,但分配和访问是隔离的。
- SMMU_IDR0.SES位指示是否支持两种安全状态。
2 仅支持单一安全状态(non-secure)的SMMU
如果SMMU被设计成仅支持单一的安全状态,那么SMMU_IDR0.SES 等于 0,表明仅支持非安全状态。但是这并不意味着secure device下的transaction不能被送到该SMMU,此时,仅支持non-secure的SMMU对于secure的transaction会进行完全的bypass处理,即:
- 不进行地址转换(translation)
- 不进行权限检查(permission check)
- 不进行属性修改(attribute override)
这种情况下,所有资源都不分配给安全域,所有事务都按Non-secure处理。资源包括Stream Match Register groups, translation context banks以及 interrupts,并且对于Secure device banked的状态及控制寄存器都将不可见。
3 支持Secure与Non-secure两种安全状态的SMMU
当SMMU_IDR0.SES 等于 1时,SMMU支持Secure与Non-secure两种安全状态,可以处理和翻译来自secure device的transactions,但是也有一些限制:
- 来自Secure device的transaction必须 由 Stage1+stage2 bypass(即只用stage 1转换,stage 2只做属性变换)的translation context来处理。
- Stage1的contex bank只能分配给secure software使用。
3.1 资源分配(Resource allocation)
- SMMU的部分资源可以被Secure软件分配为Secure专用,其余为Non-secure使用。
- 主要可分配资源包括:
- Stream Mapping Register Groups(通过SMMU_SCR1.NSNUMSMRGO分配)
- Context Banks(通过SMMU_SCR1.NSNUMCBO分配)
- Context Interrupts(SMMUv1通过SMMU_SCR1.NSNUMIRPTO分配,SMMUv2每个Context Bank有独立中断)
- Non-secure软件通过SMMU_IDR0/IDR1等寄存器读取到的资源数量会被Secure分配的值覆盖,只能看到自己可用的部分。
- 资源分配通常在Secure系统启动时静态完成,也可以通过软件接口动态调整。
3.2 允许的事务资源访问(Permitted transaction resource usage)
- Secure事务只能访问Secure分配的资源,Non-secure事务只能访问Non-secure分配的资源。
- Secure分配的Stream Mapping Register Group只能指向Secure分配的Context Bank,Non-secure同理。
- Secure分配的Context Bank必须放在Context Bank表的高位(NUMS2CB之后)。
- Secure分配的Context Interrupt只能被Secure Context Bank引用。
禁止的关系:
- Non-secure事务不能映射到Secure资源,反之亦然。
- Secure Context Bank不能参与stage 1+stage 2 translation。
- Secure Context Bank不能引用Non-secure Context Interrupt。
- Non-secure translation table walk不能进入Secure translation table walk的更高层级。
- Non-secure translation context bank不能访问Secure管理的内存。
在支持两种安全状态(Secure/Non-secure)的SMMU实现中,SMMU的部分关键资源(如Stream Mapping Register Groups、Context Banks、Context Interrupts等)可以被Secure软件和Non-secure软件分别分配和隔离使用。这种机制的核心目的是实现安全隔离,防止Non-secure域访问或干扰Secure域的关键资源。
3.3 可分配的资源类型
Stream Mapping Register Groups(流映射寄存器组)
-
用于StreamID到Context Bank的映射。
-
通过
SMMU_SCR1.NSNUMSMRGO
字段分配。 -
Secure软件通过设置
SMMU_SCR1.NSNUMSMRGO
,指定Non-secure可见的Stream Mapping Register Group数量。 -
Secure域可以访问所有组,Non-secure域只能访问未被Secure域占用的部分。
-
注意事项:
- 如果
NSNUMSMRGO
超过实现的总数,Non-secure访问超出部分的行为由实现定义(可能忽略或报错)。 - 在实现了Extended Stream Matching Extension时,默认复位为128
- 如果
Context Banks
-
用于保存地址转换和权限等上下文信息。
-
通过
SMMU_SCR1.NSNUMCBO
字段分配。 -
Secure软件通过设置
SMMU_SCR1.NSNUMCBO
,指定Non-secure可见的Context Bank数量。 -
Secure域可以访问所有Context Bank,Non-secure域只能访问未被Secure域占用的部分。
-
注意事项:
- 只能分配支持stage 1 translation的Context Bank给Secure域。
- 重新分配时,相关Context Bank的
SMMU_CBA2Rn.VA64
位会变为UNKNOWN,需重新初始化,否则可能导致安全隐患.
SMMU_CBA2Rn.VA64
在SMMUv2中,当context bank在做secure和non-secure切换时,SMMU_CBA2Rn.VA64 必须重新初始化:
- 如果当时跑在AARCH32状态下,即使用ARMv7 short descriptor和ARMv7 Long descriptor时,SMMU_CBA2Rn.VA64应该设为0
- 如果当时跑在AARCH64状态下,即使用ARMv8 Long descriptor时,SMMU_CBA2Rn.VA64应该设为1.
Context Interrupts(上下文中断)
- 仅SMMUv1支持, 通过
SMMU_SCR1.NSNUMIRPTO
字段分配。 - Secure软件通过设置
SMMU_SCR1.NSNUMIRPTO
,指定Non-secure可见的Context Interrupt数量。 - SMMUv2每个Context Bank有独立中断,不再需要分配。
3.4 资源分配的安全约束
- Secure事务只能匹配Secure分配的资源,Non-secure事务只能匹配Non-secure分配的资源。
- Secure分配的Stream Mapping Register Group只能指向Secure分配的Context Bank,Non-secure同理。
- Secure分配的Context Bank必须放在Context Bank表的高位(即NUMS2CB之后)。
- Secure分配的Context Interrupt只能被Secure Context Bank引用。
- 禁止的关系:
- Non-secure事务不能映射到Secure资源,反之亦然。
- Secure Context Bank不能参与stage 1+stage 2 translation。
- Secure Context Bank不能引用Non-secure Context Interrupt。
禁止关系 | 原因 |
---|---|
Non-secure 映射到 Secure SMRG | 防止越权访问 |
Non-secure SMRG 指向 Secure CB | 防止数据泄露 |
Secure CB 用于 Stage 1+2 | 不支持嵌套转换 |
Secure CB 引用 Non-secure 中断 | 防止中断干扰 |
Non-secure 页表访问 Secure 页表 | 防止间接访问 |
Non-secure CB 访问 Secure 内存 | 防止权限泄露 |
这些规则是 SMMU 架构中实现安全隔离的基础,必须由 Secure 软件在配置资源时严格遵守。
4. 举例说明:访问和使用的区别
访问和使用是两个不同的概念,按照Secure和Non-secure的划分原则,non-secure不能访问Secure的资源,但是Secure可以访问Non-secure的资源。下面将进行举例说明:
假设系统中共有 32 个 Context Bank(CB),并且 NSNUMCBO = 4
,我们可以根据 ARM SMMU 规范中关于资源分配的规则,明确 Secure 和 Non-secure 域各自可以访问的 CB 索引如下:
4.1 Non-secure 可访问和使用的 Context Bank
NSNUMCBO = 4
表示 Non-secure 域只能访问和使用前 4 个 CB。- 所以 Non-secure 可访问的 CB 索引为:
CB[0], CB[1], CB[2], CB[3]
在Non-secure的视角下,它只能看见这四个CB,并且反应在了SMMU_IDR1.NUMS2CB 上,non-secure视角下的SMMU_IDR1.NUMS2CB的值为4.
4.2 Secure 可访问和使用的 Context Bank
- Secure 域可以访问 所有 CB,但通常会将 Secure 专用的 CB 放在高位(即从
NSNUMCBO
之后开始)。 - 所以 Secure 可访问的 CB 索引为:
CB[4] 到 CB[31](Secure 专用,访问+使用)
+ CB[0] 到 CB[3](只可以访问)
实际上,Secure 软件拥有对所有 CB 的控制权,但为了安全隔离,只使用 CB[4] 及以上部分。
📌 总结表格
域别 | 可使用的 CB 索引范围 | 说明 |
---|---|---|
Non-secure | CB[0] ~ CB[3] | 由 NSNUMCBO 限定 |
Secure | CB[4] ~ CB[31] CB[0] ~ CB[3](可访问) | Secure 软件拥有全部控制权,但通常避免使用低位 CB 以防冲突 |
Secure 软件虽然可以读写 Non-secure 状态下的 SMMU 寄存器(如 SMMU_CBn_TCR
),但这并不意味着它可以在所有情况下“使用”这些寄存器。
操作类型 | 是否允许 | 说明 |
---|---|---|
Secure 软件读写 Non-secure 寄存器 | ✅ 允许 | 用于配置、调试等 |
Secure 软件使用 Non-secure 寄存器进行地址转换(如执行 LDR/STR) | ❌ 禁止 | 会违反安全隔离 |
访问权限不等于执行权限,Secure 软件必须使用 Secure 分配的资源来执行事务,不能“借用” Non-secure 的context bank来完成实际的数据访问。
换句话说,secure 软件可以帮non-secure 配置分给non-secure的资源(通过读写分配给non-secure的CB的控制寄存器),但是不能使用分配给non-secure的CB。
4.3 SMMU_IDR1.NUMS2CB,SMMU_IDR1.NUMCB,SMMU_SCR1.NSNUMCBO
NUMS2CB这个字段表明了当前 只 支持 stage2的context bank的数量。如果NUMS2CB=0,说明所有contex bank都支持stage2。当然,前提是SMMU_IDR0的S2TS为1,表明当前SMMU支持stage2转换。
再强调一点, stage 1 支持secure和non-secure transaction的translation,但是stage2仅支持non-secure,下图是一个context bank table的划分表:
- 首先由SMMU_IDR1.NUMS2CB决定,分出从index 为0开始的CB给stage2 only用
- 然后SMMU_SCR1.NSNUMCBO决定给Non-secure的CB,使用对象是non-secure的stage1和stage2
- 最后由SMMU_IDR1.NUMCB决定当前实现最大可用的CB数量,架构最大支持128个。
5 什么是Non-secure pagetable
Non-secure pagetable只是相对于 Secure transaction而言的,如果是non-secure transaction,所有关于secure相关的配置(比如descriptor里的NS和NSTable字段)都将被忽略,因为基于non-secure不能访问secure region的基本原则,non-secure的transaction不能指向任何secure下的资源。
如果是secure transaction,NSTable bit定义了page table是否放置在 secure还是non-secure下的内存空间。
NSTable == 0:后续 translation table 位于 Secure 地址空间。
NSTable == 1:后续 translation table 位于 Non-secure 地址空间。
如果某一层级的 NSTable = 1,则该层级之后的所有 NS 和 NSTable 位都将被忽略,后续访问都视为 Non-secure。这是一种 层级控制机制,用于在 translation table walk 中逐步决定访问的安全性。
所以当 NSTable = 1时,descriptor里的NS bit将会被忽略,即使NS=0,其指向的还只能是non-secure的资源,永远无法发出secure的访问。
为什么有non-secure的page table?
Secure 域可以在 Non-secure 内存中存储页表(translation table)映射信息,只要这些映射指向的是 Non-secure 内存。
这样做的好处是:减少对 Secure 内存的使用,而 Secure 内存通常是片上资源(on-chip),成本高、容量小。
也就是说,
- Secure 软件可以把页表(translation tables)放在 Non-secure 内存中。
- 这些页表中的映射目标(即最终物理地址)必须是 Non-secure 内存。也就是说,Secure 域可以使用 Non-secure 内存来存储页表,只要这些页表不会指向 Secure 内存。
- Secure 内存通常是片上 RAM(如 TrustZone RAM),容量有限且成本高。
- 把页表放在 Non-secure 内存中可以节省 Secure 内存资源。
- Secure 内存是片上资源,意味着它是嵌入在芯片内部的,速度快但成本高。所以合理利用 Non-secure 内存可以优化资源使用。
虽然 Secure 域可以使用 Non-secure 内存存储页表,但必须满足以下条件:
- 页表内容只能映射到 Non-secure 内存,不能指向 Secure 内存。
- 页表本身必须受到保护,防止 Non-secure 域修改其内容。
- SMMU 的配置必须确保 Secure 事务不会访问 Non-secure 页表中指向 Secure 内存的条目。
假设:
- Secure 域有一个设备需要访问 Non-secure 的 DRAM。
- Secure 软件可以在 DRAM 中创建页表,并配置 SMMU,使该设备的事务使用这些页表进行地址转换。
- 这样就不需要在 Secure RAM 中为该设备分配页表,节省了资源。