关键字:Trustzone/SAU/NSC
1. 前言
客户询问,在Trustzone打开的情况下,如果没有将NonSecure和Secure之间的
NSC接口放在一个单独的NSC分区里,而是和Secure分区混在一起会怎么样?
2. 查看SAU的配置代码
SAU配置代码一般是在相应的工程目录里。例如,对于STM32CubeH5的GPIO例
程,它在STM32Cube_FW_H5_V1.5.0\Projects\NUCLEO
H563ZI\Examples\GPIO\GPIO_IOToggle_TrustZone\Secure\Inc\partition_stm32h56
3xx.h;对于X-CUBE-FREERTOS的消息队列例程,它在Packs\STMicroelectronics\X
CUBE-FREERTOS\1.3.0\Projects\NUCLEO
H563ZI\Applications\FreeRTOS_Queues_ThreadFlags_TrustZone\Secure\Inc\partiti
on_stm32h563xx.h里。
如果打开上述两个文件,你可以看到默认情况下,SAU并没有被打开,也就是
SAU_INIT_CTRL_ENABLE为0。

3. 不使能SAU
从上文可知,如果你什么都不修改,那么你可以观察SAU不使能情况下NSC分区的
情况。以STM32CubeIDE为例,你可以手工注释掉FLASH_NSC分区。例如:

然后你将以前放入FLASH_NSC的代码放入正常的Secure分区里,如下

编译代码并下载到开发板运行,你发现没有任何问题。
是否SAU不开的例程就不安全,Non-secure就可以直接访问Secure区域?
其实并不是,我们只是更改了sgstubs所在的分区,所生成的代码依然含有secure
gateway 的指令SG。如果没有secure gateway的指令SG,直接调用Secure区域的代
码,例如,我们使用地址直接调用Secure工程中的代码。

系统直接提示我们,入口无效,如下图所示:

4. 使能SAU
在partition_stm32h563xx.h 里使能 SAU,你需要将SAU_INIT_CTRL_ENABLE 置
1,如下图所示

其实正确运行该工程,在SAU使能的情况下,还需要正确配置NonSecure Flash以
及NonSecure RAM,所以我们需要将partition_stm32h563xx.h 里的多处代码置1。
使能NonSecure Flash 如下图所示

使能NonSecure RAM如下图所示

以及使能所使用到的外设区域。

这时可以看到,当系统开始调用NSC代码时

会得到无效入口的Secure Fault。我们比较这里的无效入口的原因,不是代码编译的
问题,而是所在分区不对。

当然我们也可以将链接脚本里的信息还原,同时在partition_stm32h563xx.h使能前
面没有提到NSC分区如下:

则编译下载运行时看到能正常调用NSC函数。

5. 结论
我们可以看出,NSC分区能不能和Secure 分区混合在一起,要看SAU是否使能。如
果SAU没有使能,和Secure分区混在一起, NSC可以被正常调用,系统正常工作 ;如果
SAU使能,没有单独的NSC分区,则NSC调用会引发Secure Fault。一般推荐无论
SAU使能不使能均使用单独的NSC分区。
意法半导体公司及其子公司 ("ST")保留随时对 ST 产品和 / 或本文档进行变更的权利,恕不另行通知。买方在订货之前应获取关于 ST 产 品的最新信息。 ST 产品的销售依照订单确认时的相关 ST 销售条款。 买方自行负责对 ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任。 ST 不对任何知识产权进行任何明示或默示的授权或许可。 转售的 ST 产品如有不同于此处提供的信息的规定,将导致 ST 针对该产品授予的任何保证失效。 ST 和 ST 徽标是 ST 的商标。若需 ST 商标的更多信息,请参考 www.st.com/trademarks。所有其他产品或服务名称均为其 各自所有者的财 产。 本文档是ST中国本地团队的技术性文章,旨在交流与分享,并期望借此给予客户产品应用上足够的帮助或提醒。若文中内容存有局限或与ST 官网资料不一致,请以实际应用验证结果和ST官网最新发布的内容为准。您拥有完全自主权是否采纳本文档(包括代码,电路图等)信息, 我们也不承担因使用或采纳本文档内容而导致的任何风险。 本文档中的信息取代本文档所有早期版本中提供的信息。 © 2020 STMicroelectronics - 保留所有权利