1.ARMv8的trustzone扩展
1.1 隐私计算框架
1.2处理器的secure状态
1.四个异常等级:
EL0:执行用户态
EL1:操作系统内核
EL2:hypervsior
EL3: Secure monitor
主要执行cpu的secure相关配置,以及切换cpu在低于EL3异常等级运行时的secure状态。
EL3主要设置scr_el3寄存器
2.作用
EL0:无特权模式,所有的APP应用都在EL0
EL1:一个特权模式,能够执行一些特权执行令,用于运行各类操作系统,在Secure World则是
secure OS(如:TEE)
EL2: 主要提供对虚拟化的支持
EL3: 主要执行cpu的secure相关配置,以及切换cpu在低于EL3异常等级运行时的secure状态。
EL3主要设置scr_el3寄存器
注:EL ---- Exception Level
1.3 OP-TEE解决方案
1.4OP-TEE执行流程
OP-TEE执行流程如下图所示:
1> bl1 跳转到 bl2
- - bl1 加载 bl2 image 到 RAM、设定中断向量表以及完成其他 CPU 相关设定之后,bl1_main 函数解析出 bl2 image 的描述信息,获取入口地址,并设定下一个阶段的 CPU 上下文。完成之后,调用 el3_exit 函数实现 bl1 到 bl2 的跳转,进入到 bl2 阶段。
2>bl2 跳转到 bl31
- - bl2 将会加载 bl31、bl32、bl33 的 image 到对应权限的 RAM,并将这 3 个 image 的描述信息组成一个链表保存起来,以用于 bl31 启动 bl32 和 bl33。在 AACH64 中,bl31 为 EL3 runtime firmware。这个运行时的主要功能是处理 SMC 指令和中断,以 secure monitor 状态运行。
- - bl32 一般为 TEE OS image,例如 OP-TEE
- - bl33 为非安全 image,例如 uboot,linux 内核等。当前该部分先加载 bootloader 的 image,再由 bootloader 来启动 linux 内核。
- - bl2 跳转到 bl31 是通过传入 bl31 的 entry point info 调用 SMC 指令,触发在 bl1 设定的 SMC 异常,从而使得 CPU 将控制权交给 bl31,并跳转到 bl31 执行。
3>bl31 跳转到 bl32
- - bl31 会执行 runtime_service_init()函数,该函数会调用注册到EL3所有service的init函数,其中有一个 service 就是为 TEE 服务的。该 service 的 init 函数会将 TEE OS 的初始化函数赋值给 bl32_init 变量。当所有的 service 执行完 init 后,bl31 会调用 bl32_init 跳转到 TEE OS 的执行。
4>bl31 跳转到 bl33
- - TEE_OS image 启动完成之后,会触发一个 ID 为 TEESMC_OPTEED_RETURN_ENTRY_DONE 的 SMC 调用来告知 EL3 TEE OS image 已经完成了初始化,然后将 CPU 状态恢复到 bl31_init 的位置继续执行。
- - bl31 通过遍历在 bl2 记录的 image 链表来找到需要执行的 bl33 image。然后通过获取到 bl33 image 的镜像信息,设定下一个阶段的 CPU 上下文,退出 EL3 然后进入到 bl33 image 的
1.5Boot Loader
1.BL1
BL1是信任链的根所在。一般固化在芯片内部的一段代码,叫作bootrom,具有最高的执行权限 EL3,一般被厂家写死。bootrom通常会映射到它专属的一块内存中,向这块内存写入数据,一般都 会出错
芯片上电或复位后,bootrom的代码会从固定位置加载BL2来初始化sram,在BL2验证通过后会跳转到BL2,以保证可信任执行。
2.BL2
运行在EL3特权级别,BL2在flash中是一段可信安全代码,它的信任建立在BL1对它的验证,主要完成一些平台相关的初始化,如对ddr的初始化等。
3.BL31
①CPU、C运行环境、基本硬件以及EL3中断处理框架(支持EL3情况下)初始化。
②页表创建和cache使能。
③启动后级镜像以及准备新镜像的跳转。
④处理smc命令的运行运行时的服务注册,运行时不同secure状态的smc处理。以及异常等级切换上
4.BL32
所谓的Secure OS,如ARM的TEE。
一般在BL32会运行在OPTee OS+ 安全app。它是一个可信安全的OS运行在可信安全的OS运行在EL1并在EL0启动可信任APP(如指纹信息,移动支付密码等),并在Trust OS运行完成后通过SMC指令返回BL31,BL31切换到Mon-Secure World继续执行BL33.
5.BL33
Normal World,运行的都是非安全固件,即常见的UEFI firmware或者u-boot,也可以直接启动Linux Kernel。
2.交互流程
2.1 软件逻辑流程
软件逻辑流程:
1.首先CA需要图Trusted OS之间建立一个Context,以后CA与TEE环境的所有通信均基于此Context。
2.然后CA会向Trusted OS申请与联系的TA建立一个Session
3.CA与TA之间的Session建立完成之后,CA即可向TA发送Commond。
4.Commonds及其参数会通过共享内存的方式传递,TA从共享内存中获取到CA的请求以及请求参数
5.TA在TEE环境下执行处理,得到的处理结果重新填充到共享内存中,CA通过共享内存就可以获取到处理结果
6.获得处理结果后,如不需要进一步请求,则由CA发起关闭Sessio的请求,Trusted OS回收TA相关资源,最后发起销毁Context的请求,完成一次完整的交互。
2.2CA/TA通信
执行流程:
打开会话 ---- 执行命令 ---- 关闭会话
3交互原理
CA通过调用TEE Client API 接口触发系统调用,陷入REE的操作系统内核态,系统根据CA的入参来找到需要执的REE驱动程序,REE驱动程序通过SMC(secure monitor call,安全监控模式调用)汇编指令进入Monitor模式,并修改安全状态读写信号位就,将CPU切换到安全内核态(改变寄存器左后1bit为0,1为非安全),进入secure world
切换到TEE后,CA的服务请求通过Binder传到TEE侧,然后TEE OS通过TEE Internal API 拉起对应的TA,TA运行结束后将结果和数据返回的CA。执行完成后回到TEE内核态,再通过SMC汇编指令进入Monitor切换到REE环境。