当前位置: 首页 > news >正文

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-secureCB[0] ~ CB[3]NSNUMCBO 限定
SecureCB[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 中为该设备分配页表,节省了资源。
http://www.dtcms.com/a/392565.html

相关文章:

  • 面向linux新手的OrcaTerm AI 最佳实践
  • 构建高可用 LVS-DR + Keepalived 负载均衡集群实战指南
  • 网络协议总结
  • Python多线程爬虫加速电商数据采集
  • JVM之直接内存(Direct Memory)
  • 深入理解C指针(四):回调函数与qsort——指针实战的终极舞台
  • 翻拍图像检测(即拍摄屏幕的照片)功能实现思路
  • 【Linux】进程概念(上):从冯诺依曼到进程入门
  • 计算机视觉(opencv)实战二十八——基于 OpenCV CSRT 跟踪器的实时目标
  • 【Mysql】深分页问题、页分裂问题、加密/解密、执行计划
  • 【名人简历】牛顿
  • coze开发的牙科AI智能体助手web页面
  • JavaEE初阶——从入门到掌握线程安全
  • GitHub热门大数据项目:基于人体生理指标管理的可视化分析系统技术解析
  • 零基础学Docker(2)--基本命令
  • 华为FusionCloud私有云:企业数字化转型的智能底座
  • 【LVS入门宝典】LVS NAT模式深度解析:从原理到实战配置指南
  • MQ 项目(实习项目,初步更新)
  • Redis中Lua脚本的应用场景分析
  • phpkg 让 PHP 摆脱 Composer 依赖地狱
  • Python -- 人生重开模拟器(简易版)
  • CSS基础查缺补漏(持续更新补充)
  • 用户生命周期价值(CLV)目标变量系统性设计与实践(二)
  • TDengine 与工业应用平台 Ignition 集成
  • JVM垃圾收集中判断对象存活相关问题
  • 【C++】告别“类型转换”踩坑,从基础到四种核心强制转换方式
  • WinDivert学习文档之五-————编程API(八)
  • 【LVS入门宝典】LVS NAT模式深度解析:流量走向与IP包头修改机制
  • 第二章 微调:定制专属模型——从通用能力到场景适配
  • 为统信UOS2.0离线安装python3.11.9开发环境