了解 TEE OS
关于本文,是一篇会议纪要,会议主题是《从 Linux Kernel 角度看 TEE》,主讲人是周贺贺。它适用于嵌入式系统开发/驱动开发/内核设计/安全业务设计从业者,目的是让自己掌握 TEE 基本概念,知道大系统软件架构。同时也解答下面几个问题
- armv7 有几种模式?
- armv8/armv9 有几种安全状态?
- 现在的手机上都是双操作系统吗
- 什么是 IRQ,FIQ?
- 什么是 TEE,什么是 TEE OS?
1 软件/安全架构
学习 Trustzone/TEE ,其实就是学习 arm 架构,建议选择新架构而不是早期架构,比如 armv8-aarch64 和 armv9 来进行学习。
1.1 软件架构(2022)
1)两个执行状态:Non-secure 状态;Secure 状态
2)四个安全等级:PL0,PL1,PL2,PL3
1…2 发展历程(2002…2022)
1)发展历程:Trustzone -> Hypervisor(EL2) -> S-EL2 -> FF-A -> CCA(RME) -> …
2)演变趋势:越来越复杂,也理解操作系统的权限越来越小(最小特权原则)
1.3 主流架构(2022)
1)TEE 是可信执行环境,运行在 secure 侧的所有程序;TEE OS 特指运行在 secure 侧的 OS
2)从 Kernel 的角度看,业务可能会从 non-secure 侧切换到 secure 侧,这样就让内核开发从白盒变黑盒
1.4 Secure boot 模型
1)BL1: 是 BootROM,它的其中一个功能是加载 BL2 镜像到内存,并启动 BL2
2)BL2:用于加载并验证 BL31/BL32/BL33 镜像到内存
3)BL31: 是 ATF,维持 Runtime 状态,用于切换 CPU 上下文(BL32 和 BL33)
4)BL32: 进入 secure 状态,干活
5)BL33:进入 non-secure 状态,干活
1.5 Runtime 模型
1)双操作系统,分别指 non-secure 侧的非安全状态和 secure 侧的安全状态
2)ATF(BL31)是运行时的一段程序,用于切换上下文
3)通信机制:apps <–> libteec.so <–> tee_driver <–> opteed <–> optee_os <–> TAs
2 TEE 与内核相关
2.1 交互接口
1)对于业务开发商,需要进行安全业务设计,比如基于 SDK 调用 API 接口,或者开发设备 Driver
2)对于 TEE 厂商,需要客制化 TEE 驱动,实现安全操作
2.2 内存隔离
1)内存隔离:secure 空间和 non-secure 空间不是同一个虚拟地址空间。
2.3 调度模型
1)一个模式是 user 线程调用 TEE 库
2)另一个模式是 user 线程 进入 kernel 线程,然后通过 tee_work 线程统一调用 TEE
3)即使线程 Normal 切换到 Secure 状态,不影响 kernel 线程调度(从 Kernel 的视角,随时将线程从 TEE 状态唤醒)
3 标准和规范
1)GP:应用角度只需要了解这个规范,关于如何使用 API
2)PSCI:启动从核时,对 Power 的标准与约束
3)FF-A:关于运行时如何切换,如何启动相关标准
4)SMCCC:规范 smc_abi ,约束 TEE 厂商和 SOC 厂商的接口和使用
5)SEDI:关于系统资源的规范,不介绍
6)SCMI:关于系统资源的规范,不介绍
3.1 示例:多核启动
1)启动从核:Linux Kernel 发出请求
2)EL3 初始化:N/A
3)S-EL1&0 初始化:N/A