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_CTRL0xE000_EDD0SAU控制寄存器
SAU_TYPE0xE000_EDD4SAU setting region的数量,只读
SAU_RNR0xE000_EDD8SAU Setting region 寄存器
SAU_RBAR0xE000EDDCSAU Setting region 起始地址
SAU_RLAR0xE000EDE0SAU Setting region 结束地址和属性

关于具体设置,当SAU未使能时,可以通过SAU_CTRL_ALLNS配置所有地址是Non-Secure或者全部是Secure,使能之后SAU会对地址进行匹配,匹配成功之后根据SAU_RLAR.NSC配置区域是Non-Secure-Callable或者单纯的Non-Secure状态。多说没用,一图就能看明白。

SAU寄存器配置

CORE相关寄存器

Secure Non-Secure划分

从上图来看,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中断。


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

相关文章

发表新评论