(个人学习笔记)
转载:https://blog.youkuaiyun.com/zhajio/article/details/83622310
TrustZone实现原理
TrustZone在概念上将SoC的硬件和软件资源划分为安全(Secure World)和非安全(Normal World)两个世界,所有需要保密的操作在安全世界执行(如指纹识别、密码处理、数据加解密、安全认证等),其余操作在非安全世界执行(如用户操作系统、各种应用程序等),安全世界和非安全世界通过一个名为Monitor Mode的模式进行转换,如图1:
处理器架构上,TrustZone将每个物理核虚拟为两个核,一个非安全核(Non-secure Core, NS Core),运行非安全世界的代码;和另一个安全核(Secure Core),运行安全世界的代码。
总线设计
TrustZone 在系统总线上针对每一个信道的读写增加了一个额外的控制信号位,这个控制位叫做Non-Secure或者NS位,是AMBA3 AXI总线针对TrustZone作出的最重要、最核心的扩展设计。
这个控制信号针对读和写分别叫做ARPORT[1]和AWPORT[1]:
- ARPROT[1]: 用于读操作(Read transaction), 低表示Secure, 高表示Non-Secure
AWPROT[1]: 用于写操作(Write transaction), 低表示Secure,高表示Non-Secure
非安全世界的主设备(Non-Secure masters)在操作时必须将信号的NS位置高,而NS位置高又使得其无法访问总线上安全世界的从设备(Secure Slaves),简单来说就是对非安全世界主设备发出的地址信号进行解码时在安全世界中找不到对应的从设备,从而导致操作失败。
处理器设计
TrustZone中,每个物理处理器核被虚拟为一个安全核(Secure)和一个非安全核(Non-Secure),安全核运行安全世界的代码,非安全核运行除安全世界外的其它代码。由于安全世界和非安全世界的代码采用时间片机制轮流运行在同一个物理核上,相应的节省了一个物理处理器核。
内存设计
MMU是地址翻译器:把虚拟地址翻译为物理地址
安全世界和非安全世界都有自己的虚拟MMU,各自管理物理地址的映射。实际上只是两个世界都有一份TTBR0、TTBR1、TTBCR寄存器,因此就会对应两个MMU表。
尽管MMU有两套,但TBL缓存硬件上只有一套,因此TBL对于两个世界来说是共享的,其通过NS位来标志其每一项具体属于哪一个世界。这样在两个世界间进行切换时不再需要重新刷新TLB,提高执行效率。
中断设计
同TLB类似,硬件上两个世界共享一套Cache,具体的Cache数据属于哪一个世界也由其NS位指定,在世界间切换也不需要刷新Cache。
系统模式切换详解
非安全世界转到安全世界,得先通过Mointor Mode。
为什么安全模式和非安全模式不能直接切换?
协处理器CP15的寄存器SCR(Secure Configuration Register)有一个NS位用于指示当前处理器位于哪一个世界,该寄存器在非安全世界是不能访问的。当CPU处于Monitor Mode时,无论NS位是0还是1,处理器都是在安全世界运行代码。因此Monitor Mode下总是安全世界,但如果此时NS为1,访问CP15的其它寄存器获取到的是其在非安全世界的值。
非安全世界无权访问CP15的SCR寄存器,所以无法通过设置NS来直接切换到安全世界,只能先转换到Monitor Mode,再到安全世界。
如果软件运行在安全世界(非Monitor Mode)下,通过将CP15的NS位置1,安全世界可以直接跳转到非安全世界,由于此时CPU的流水线和寄存器还遗留了安全世界的数据和设置,非安全模式下的应用可以获取到这些数据,会有极大的安全风险。因此,只建议在Monitor Mode下通过设置NS位来切换到非安全模式。(MonitorMode为什么就可以直接转到安全世界?对MonitorMode描述不够完整)
非安全世界到MonitorMode详解
还没搞懂
MonitorMode到安全世界详解
还没搞懂
非安全世界到Monitor模式的切换方法:
处理器从非安全世界进入Monitor Mode的操作由系统严格控制,而且所有这些操作在Monitor Mode看来都属于异常。 从非安全世界到Monitor Mode的操作可通过以下方式触发:
软件执行SMC (Secure Monitor Call)指令
硬件异常机制的一个子集(换而言之,并非所有硬件异常都可以触发进入Monitor Mode),包括:
IRQ
FIQ
external Data Abort
external Prefetch Abort