什么是Trusty OS
为了应对开放系统的安全风险,Global Platform(GP)提出了可信执行环境的概念(TEE)。TEE要求在设备上有一个能够与Rich OS(例如Android)并存,并运行于独立空间的系统。这个系统的安全级别更高,可以为Rich OS提供密钥存储、加解密计算等服务。很明显,这种系统的实现需要获得从芯片到软件的整套支持。很早以前ARM就推出了基于自己核心的解决方案---TrustZone。而各个下游厂商通常会在此基础上各自实现自己的软件系统,对Rich OS的接口也各不相同。这在一定程度上造成了开发成本的上升以及软件系统的碎片化等问题。而Trusty OS就是谷歌针对这些问题提出的解决方案。
下图是Trusty的一个大致构架,可以看出Trusty OS和Android是相对独立运行的,他们之间通过特定的接口驱动进行通信。
图1 Trusty OS 框架
此外,由图中也可以看出Trusty OS可以直接接管硬件资源,这也在很大程度上提高了系统的安全性。关于这一点,在后面的应用场景中进行更详细的讨论。
有可能是因为Trusty不强制要求,目前的AOSP默认情况下似乎还没有包含这部分内容。不过我们可以通过下面的命令直接下载代码:
$ repo init -u https://android.googlesource.com/trusty/manifest
$ repo sync
启动过程
Trusty的内核与Android Bootloader有一个同样的名字---Little Kernel(LK),实际内容也差不多。我们先来看启动过程。在目录trusty/external/lk/arch/arm64中我们可以找到链接脚本system-onesegment.ld。其中的ENTRY(_start)指定了LK从_start函数开始。而_start的定义在同一目录下的文件start.S中。start.S会做一些CPU的初始化工作,然后通过bl指令跳至lk_main函数。
前面提到的lk_main在trusty/external/lk/top/main.c中,它主要完成的工作如下:
1 void lk_main(ulong arg0, ulong arg1, ulong arg2, ulong arg3) 2 { 3 … … 4 thread_init_early();//初始化thread相关的结构体上下文 5 arch_early_init();//初始化MMU、向量表之类构架相关的东西 6 lk_primary_cpu_init_level(LK_INIT_LEVEL_ARCH_EARLY, LK_INIT_LEVEL_PLATFORM_EARLY -