TrustZone基本环境的搭建
在前面文章中,我们已经简单介绍了TrustZone相关的一些基本知识,包括S,NS,NSC空间的划分,S和NS之间的调用和跳转等等。另外对于TrustZone程序的编写,以及如何编写支持Non-Secure Call的函数,如何在Secure模式下面调用Non-Secure函数等等。今天我们来聊一聊IAR环境下面TrustZone和CORE中一些相关寄存器的配置。
内存地址划分
为了实现S,NS,NSC地址空间的划分,最简单的方式就是通过CORE内部自带的SAU进行配置,当然还可以通过IDAU或者TRDC进行更为详细的配置,不过那些都是比较复杂的,并且和SOC的具体实现相关,所以这里就针对CORE内部自带的一个SAU进行详细说明。
SAU模块寄存器:
名称 | 地址 | 描述 |
---|---|---|
SAU_CTRL | 0xE000_EDD0 | SAU控制寄存器 |
SAU_TYPE | 0xE000_EDD4 | SAU setting region的数量,只读 |
SAU_RNR | 0xE000_EDD8 | SAU Setting region 寄存器 |
SAU_RBAR | 0xE000EDDC | SAU Setting region 起始地址 |
SAU_RLAR | 0xE000EDE0 | SAU Setting region 结束地址和属性 |
关于具体设置,当SAU未使能时,可以通过SAU_CTRL_ALLNS配置所有地址是Non-Secure或者全部是Secure,使能之后SAU会对地址进行匹配,匹配成功之后根据SAU_RLAR.NSC配置区域是Non-Secure-Callable或者单纯的Non-Secure状态。多说没用,一图就能看明白。
CORE相关寄存器
从上图来看,SCB
, NVIC
, Systick
等等都是有S和NS两套的,因为在Secure状态下,系统要保证可以同时访问Seucre模式下的CORE寄存器,还要访问Non-Secure模式下的寄存器,这个时候,对于Secur来说,Non-Secure系统相关寄存器地址要进行偏移修正,比如对于NVIC_ICTR
寄存器来说,正常的访问地址是0xE000E004
,但是如果要访问Non-Secure下的NVIC_ICTR
,那么相应的地址就要变化为0xE002E004
,这样就可以保证系统可以访问两套NVIC寄存器了。而SAU因为其特殊性,所以只能在Seucre核心去访问。
需要注意到是,在Non-Secure模式下面访问这些CORE相关的寄存器的时候,比如NVIC_ICTR
,依然是访问0xE000E004
,偏移之后的地址0xE002E004
的地址访问是会出错的,偏移之后的地址一般是RAZ/WI
(Read As Zero, Write Ignored)状态。
实际上CORE会根据当前CPU的状态来决定访问S和NS模式下的系统寄存器。
˙中断的配置
我们知道TrustZone模式下面,中断实际上也是对应两个中断向量表,每个模式下面可以分别配置中断向量表位置,分别开启和关闭中断等等。而对于每一个中断源,实际上是可以单独配置是开启Secure中断还是Non-Secure中断的,这个配置是通过NVIC->ITNS[n]
实现的,ITNS
是一个系列的寄存器,每个寄存器分别对应32个中断类型的设置,比如NVIC->INTS[n]
的INTS[m]
比特就控制32n+m
中断,如果比特为1就产生Non-Secure中断,否则产生Secure中断。
最后更新于 2019-11-19 15:23:46 并被添加「TrustZone C」标签,已有 4980 位童鞋阅读过。
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。