ARM TrustZone技术简介 -- 3 (BL31 Secure Monitor简介)

ARM 104浏览

在使用TrustZone技术的嵌入式设备当中,无法避免的需要解决从非安全侧切换到安全侧的问题,而为了完成这个切换,需要一个专用的进行非安全上下文和安全上下文切换的固件,这个固件一般我们称为arm trust firmware,在ARM官方维护的github中我们能够下载到其完整的代码

https://github.com/ARM-software/arm-trusted-firmware

在其github工程的介绍里,有完整的arm trusted firmware的移植和适配的方法,所以可以很方便的将其移植到不同的平台并进行适配,自己的操作系统。

arm trusted firmware的工作方法如下图所示


图中的EL3 Firmware就是BL31,也就是arm trusted firmware,通过其框图我们可以看到其包括多个组成部分,第一级是一个中断处理入口叫做 SMC interface,其用汇编代码写成,用来接收来自非安全侧或者是安全侧的SMC指令造成的陷入到EL3的异常请求,然后SMC Interface根据其SMC 指令中传入的立即数,通过Service Router进行处理函数分发,按照分类主要的处理分发分为非安全世界和安全世界的World
Switcher,一些需要在EL3访问的硬件资源的驱动类代码,最后是一大类的PSCI电源管理模块(包括挂起处理器,恢复处理器运行,处理器的上下电等PSCI电源管理的内容)。

其中我们着重分析World Switch和PSCI的部分,个人对特殊的EL3硬件访问接口所知不多,所以不做介绍。

1, World Switch

非安全世界和安全世界的切换,这个是arm trusted firmware的主要功能,其中的主要功能集中在service/spd 目录中然后其根据不同的安全OS的操作系统来进行不同的Dispatch,所以这里的spd是 Secure Payload Dispatch的简写,其根据SMC FID的不同来选择不同的optee_smc_handler, trusty_smc_handler, tspd_smc_handler来对具体的命令来进行处理。

比如 TSP_PREEMPT是当运行在安全侧的时候非安全侧的IRQ中断发生了,从而触发了中断当前安全侧业务,切换到非安全侧执行中断处理函数,然后再返回安全侧的动作。

而 TSP_EL1_INTERRUPT是和TSP_PREEMPT相反的动作。

而在optee_smc_handler这些具体的SMC中断处理函数中有对其具体命令的具体处理。


2, PSCI电源管理

如果不知道PSCI是什么那么请参考

http://infocenter.arm.com/help/topic/com.arm.doc.den0022d/Power_State_Coordination_Interface_PDD_v1_1_DEN0022D.pdf

在标准的Linux操作系统的处理器电源管理通用接口中,对ARM处理器有专用的PSCI模块,来对CPU的上线和离线进行处理,其中包括了对中断的迁移,对处理器状态切换的保存,而在最终的操作硬件的阶段,可以通过对设备树的PSCI模块进行配置从而选择使用什么SMC指令或者HYP指令将当前的处理器进行挂起恢复,上电和下电。


ARM TrustZone技术简介更像是一个简单的介绍和怎样把整个系统串起来的线索,如果对其中的具体实现很感兴趣,可以具体阅读代码,也许后面我会写一些代码分析的博客,来更详细的介绍其中的细节。 (代码分析是写书最快的途径....但是实际上对读者对系统架构的了解作用了了)