LAT1270
Local Application Tips
LAT1270 – Rev 1.0– Jun. 2023
STM32 TrustZone 开发调试技巧(1)—— 地址安全区及资源安全属性配置
关键字:ARM Cortex V8M,CM33 内核,TrustZone, SAU(Security Attribution Unit),
IDAU(Implementation Defined Attribution Unit),GTZC(Global TrustZone Controller),
Secure(S),NonSecure(NS), Secure NonSecure Callable(NSC)
1. 引言
STM32 MCU 中较新的产品系列例如 STM32L5、STM32U5 采用了 ARM Cortex V8M 的
CM33 内核,并引入了 TrustZone 概念。在此基础上,从内核到存储器再到外设等设计了完整
的支持 TrustZone 架构的系统隔离机制。
在新的 TrustZone 架构下,软件的开发由原来的单一工程,变成了 Secure 安全和
NonSecure 非安全两个工程的联合开发,系统上电首先从 Secure 工程开始运行,完成必要
初始化之后跳转至 NonSecure 工程运行,之后 NonSecure 工程还可以通过调用 Secure 工
程经由 NSC(Secure 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 所示。