LAT1270
Local Application Tips
LAT1270 Rev 1.0 Jun. 2023
STM32 TrustZone 开发调试技巧(1—— 地址安全区及资源安全属性配置
关键字:ARM Cortex V8MCM33 内核TrustZone, SAU(Security Attribution Unit),
IDAU(Implementation Defined Attribution Unit)GTZCGlobal TrustZone Controller),
Secure(S)NonSecure(NS), Secure NonSecure Callable(NSC)
1. 引言
STM32 MCU 中较新的产品系列例如 STM32L5STM32U5 采用了 ARM Cortex V8M
CM33 内核,并引入 TrustZone 概念。在此基础上,从内核到存储器再到外设等设计了完整
的支持 TrustZone 构的系统隔离机制。
在新的 TrustZone 架构下,软件的开发由原来的单一工程,变成了 Secure 安全和
NonSecure 非安全两个工程的联合开发,系统上电首先从 Secure 工程开始运行,完成必要
初始化之后跳转至 NonSecure 工程运行,之后 NonSecure 工程还可以通过调用 Secure
程经由 NSCSecure NonSecure Callable)区提供的 API 调用 Secure 程的函数。
由于此时系统的所有资源,包括 Memory、外设等等都区分了安全和非安全属性,而
CPU 也区分安全和非安全运行状态,其对应的安全或非安全代码及其使用的数据都需要有
应的存储空间存放,且该存储空间需要具有相同的安全或者非安全属性,否则代码无法正常
运行。因此,在 TrustZone 架构下首先需要针对不同物理区间做地址安排及相应安全属性
正确配置。对于 V8M 内核来说,这涉及到 SAU/IDAU 的配置,且取指令与取数据可能有不
同的访问规则,同时指令以及数据是否能够从 memory 中正确取得,除了和 SAU/IDAU 的配
置有关以外,还与 Memory 自身的安全属性配置有关。
本文将对 SAU/IDAU 配置,Memory 的自身安全属性配置,以及内核访问指令与数据时
的安全访问规则加以阐述,希望可以帮助相关开发者更好地理解 V8M TrustZone 的架构以及
STM32 中的实现,同时,还会列举一些 memory TrustZone 安全配置相关的常见问
题及分析方法,给开发者做参考。
2. CM33 内核的安全扩展
CM33 内核使用 AHB5 总线,具有可选安全扩展(Security Extension)功能。使能安全扩
展的内核则支持 V8M TrustZone 架构,此时 AHB5 总线上将携带安全访问标记信号
(HNONSEC),这个标记将指示当前访问 Transaction 是安全访问还是非安全访问,总线
的从设备需要识别这个标记信号,根据 Transaction 携带的安全、非安全权限信息,决定是
否允许最终的物理访问
内核的安全扩展除了总线携带的安全标记信号以外,还包括 CPU 本身的安全/非安全运
行状态,有对应安全/非安全状态 CPU 寄存器(例如各自的 stack pointer MSP
PSP),中断等等。CPU 可以在安全和非安全状态之间切换,这个切换可能来自于函数调
用,也可能由中断触发,如图 1 所示。
LAT1270
LAT1270 - Rev 1.0 page 2/33
1. CM33 内核的安全状态及其切换
本文的内容将主要集中在内核在不同安全状态下对资源的访问权限和规则方面
3. 内核的 SAU IDAU
SAU CM33 内核的单元,负责内核对地址的安全访问控制。IDAU 同样作为内核安全
访问控制的一部分,与 SAU 共同作用,只不过 IDAU 是芯片厂商实现的独立接口,其行为
由芯片厂商的设计决定
CM33 TrustZone 的内核所访问的任何地址在 SAU IDAU 看来都具有其安全属性,
地址安全属性可能是下面三种中的一种:
S - Secure: 纯粹 Secure 地址,只能由安全代码访问,不应放置 SGSecure
Gate)入口指令,不允许 NS 代码直接函数调用。
NSC - Secure NonSecure Callable:特殊的 Secure 地址,依旧是 Secure 属性,但
是可以放置 SG 指令,作 NS 调用 S 函数的入口地址。
NS - NonSecureNonSecure 地址。
2 显示了这三种类型的的地址在出现 NS S 的函数调用时的作用。
2. SNSNSC 三种类型地址使用示例