trustZone学习
安全状态(放重要的信息),正常状态(放一些正常信息的放在这里)
在armv7-m 是两个状态一个线程模式一个异常模式
在armv8-m时分成了四个状态,一个是正常状态的线程模式和异常模式
另外一个是安全状态下的线程模式和异常模式
引入trustZone后中断也有差异,最主要的差异存在一个清0的操作
先把所有的寄存器入栈,入栈后把全部寄存器清0,然后在切换cpu的运行状态,
中断运行完以后先切换cpu的运行状态,在把全部寄存器进行出栈,
为什么要把寄存器清0,清0的作用,把PSR寄存器复位了,让黑客找不到栈的一些内容
另外一个变化是整个cortex -m的4GB地址空间在每一块空间里面分成了安全状态下的一块
正常状态的一块
在切换安全和正常状态下的cpu寄存器状态也做了更改
之前的时候R13只有msp和psp
在v8带了trustZone的
MSP_NS,MSPLIM_NS
psp同理
在v8时系统加入了栈溢出检测,还有栈溢出中断
引入了,non-secure内存和secure内存那程序之间怎么调用?
arm引入看sg列表的概念
比如在non-secure中调用了一个secure里的函数,先call在sg列表中
在到sg列表找到你的函数入口地址,在把函数地址送到pc,然后在运行secure里的函数
整个运行环境切换到安全状态,在这个环境下访问cpu会受到各种安全条件的检测和限制
(在m33的权威指南)
sg列表怎么实现的,通过代码对你的各个函数的安全的函数的注册(可能是)以后,、
c编译器会自动产生一个sg列表放在一个区域中
在renesas的RA MCU怎么用trustzone
renesas会有一个安全加密引擎v9
安全的软件可以同时访问安全的和非安全的内存和资源,而非安全的软件只能访问非安全的内存和资源。
内存分离代码闪存、
数据闪存和SRAM被分为安全(S)、
非安全(NS)和非安全可调用(NSC)区域。
当设备生命周期为“安全软件开发(SSD)”状态时,
通过串行编程命令将这些内存安全属性设置到非易失性内存中。
瑞萨IDAU区域设置IDAU(实现定义的属性单元)区域只能在引导模式下使用SCI( 串行通信接口)或USB进行设置,
不能在远程更新期间进行操作(例如,OTA)
调试和编程接口可以通过设备生命周期管理进行完全锁定。
支持Arm®TrustZone®的RAMCU使用设备生命周期管理系统来控制三个调试级别:
DBG2:允许使用调试器连接,并且不限制访问内存和外设。
DBG1:允许使用调试器连接,并且仅限于访问非安全的内存区域和外设。
DBG0:不允许使用调试器连接。
定义属性单元(IDAU)来设置安全区域。
后面靠jlink来,从一种状态到另一种状态的转换