本帖最后由 manhuami2007 于 2023-1-2 18:35 编辑
上一个帖子大概介绍了TrustZone的基本原理,接下来要写如何实现TrustZone。在初始化阶段可以借助st公司提供的cubemx等软件进行设置,具体步骤如下。
1.配置Flash的别名区
通过programer 配置"option bytes"里的TZEN和DBANK位,TZEN是使能Flash的TrustZone功能,DBANK是使能Flash的双bank功能。
使能上面2个位之后,在option bytes中就出现了下面的选项,其中"secure area"选项负责设置2个bank的安全区域的大小。每个bank对应1个secure area 。
下图中,SECWMx_PSTRT和SECWMx_PEND这2个参数是设置flash安全区的起始页和终止页的。
比如把第一个bank全部设置成安全区:SECWM1_PSTRT=0,SECWM1_PEND=0x7F 。第二个bank全部设置成非安全区:SECWM2_PSTRT=1,SECWM1_PEND=0。设置规则如下图所示。
2.使用stm32cubemx配置
在使用cubemx建立工程的时候会出现弹出框,询问是否建立TrustZone工程,这时要选是。
2.1 设置GZTC
首先设置GZTC,GZTC控制了SRAM的访问。在这里定义SRAM的安全区和非安全区。cubemx默认将SRAM1、SRAM2和SRAM4用于安全区,SRAM3用于非安全区。如下图所示,注意2个图片的区别是"Area size"不同。
SRAM1、2、3、4都是片内的SRAM。如下图的简介所示。
2.2 外设和中断的设置
这里要配置2个LED,1个按键和1个串口。其中1个LED用于安全区,1个用于非安全区。串口在非安全区。按键使用外部中断,并且可以通过串口配置这个中断是工作在安全区还是非安全区。
首先在cubemx中配置PB7(蓝色LED)工作在安全模式,如下图所示:
PC7(绿色LED)工作中非安全模式,如下图所示:
PC13是按键,按键按下时触发外部中断,先工作在安全模式。并且在NVIC_S中使能EXIT_13中断。
使用UART1作为串口,将其勾选在M33_NS模式。
至此初始化工作完成,配置了Flash、SRAM、外设和中断的工作安全模式。下一步开始使用。
3.编写NSC代码
现在安全区的代码和非安全区的代码是独立的,两者需要建立联系,才能互相调用。
安全区的代码是可以直接调用非安全区的代码的,可以通过绝对地址进行调用,而在代码中则是通过函数指针代替了绝对地址进行调用。
非安全区的代码要想访问安全区的代码,需要NSC(非安全可调用)代码作为中介。也就是说非安全区的代码不能随便调用安全区的代码,只能调用安全区通过NSC表现出来的代码。
在工程中,上面2个部分的代码都是在安全区工程中的"secure_nsc.c"文件中的。这个文件的代码会被编译成库文件,供非安全区代码调用。
具体代码的实现,请见下一个帖子。