2. TEE架构概览:从规范到硬件隔离

这一章,我们来聊聊TEE的整体架构。说实话,很多刚入行的朋友容易把TEE想得太神秘。其实说白了,它就是一套在安全世界里运行的迷你操作系统,有自己的内核、驱动和应用。我最早接触TEE时也犯过迷糊,以为它就是个黑盒子。后来踩过几次坑才明白——搞清楚架构,后面做启动适配才能少走弯路。

2.1 GlobalPlatform TEE规范——TEE界的“宪法”

GlobalPlatform(简称GP)是一个国际标准组织,它定义了TEE应该长什么样。你可以把它理解成TEE行业的“宪法”——各家芯片厂商(ARM、高通、MTK等)都得按这个规矩来。

GP规范主要规定了三件事:

  • TEE内部架构:组件怎么划分,谁管谁
  • 安全通信协议:REE(普通世界)和TEE怎么说话
  • API标准:TA(可信应用)怎么调用TEE服务

我个人习惯把GP规范分成两个层面来看:

层面 内容 我的理解
TEE内部架构 OS、Trusted Kernel、TA的职责划分 相当于TEE的“三权分立”
REE-TEE通信 Client API、共享内存、SMC调用 两个世界之间的“外交渠道”
小提示: 做启动适配时,你最常打交道的是GP的“TEE Initialization Sequence”章节。那里详细描述了从ROM代码到TEE OS加载的每一步。我建议你把那部分打印出来贴在工位上。

2.2 TEE内部组件——拆开看看里面都有啥

一个典型的TEE系统,内部有三个核心组件。嗯,咱们一个一个来看。

2.2.1 TEE OS(可信操作系统)

TEE OS是整个安全世界的“大管家”。它负责:

  • 管理安全内存和中断
  • 调度TA的执行
  • 提供密码学服务
  • 处理来自REE的SMC请求

常见的TEE OS有:OP-TEE(开源)、Trusty(Google)、QSEE(高通)、Kinibi(Trustonic)。我在项目中用过OP-TEE和QSEE,说实话,OP-TEE的代码结构更清晰,适合学习;QSEE的闭源部分比较多,调试起来有点头疼。

2.2.2 Trusted Kernel(可信内核)

这里要注意一个容易混淆的点:有些文档把TEE OS直接叫“Trusted Kernel”,但严格来说,Trusted Kernel是TEE OS内部最核心的那一层——它负责:

  • 内存管理(MMU配置、页表管理)
  • 中断处理(安全中断路由)
  • 上下文切换(TA之间的切换、REE与TEE的切换)

说白了,Trusted Kernel就是TEE的“微内核”。它比Linux内核小得多,但实时性要求更高。我曾经在调试一个中断响应超时的问题时,发现是Trusted Kernel里的中断优先级配置错了——那一次让我深刻理解了“微内核不是小内核,而是精内核”。

2.2.3 Trusted Applications(可信应用,TA)

TA是运行在TEE里的安全应用。比如:

  • 指纹比对TA
  • 支付密钥管理TA
  • DRM解密TA

TA和普通App最大的区别是:TA不能直接访问外设,所有I/O都得通过TEE OS代理。你想想看,这其实是一种“最小权限”的设计——TA就算被攻破,也搞不坏硬件。

避坑指南: 做启动适配时,TA的加载顺序很关键。有些TA之间有依赖关系(比如密钥管理TA依赖随机数生成TA),如果加载顺序错了,系统会卡死在初始化阶段。我曾经因为没仔细看TA的manifest文件,浪费了整整两天。

2.3 硬件隔离基础——TrustZone与TrustZone-M

软件架构再牛,没有硬件隔离也是白搭。ARM的TrustZone技术就是TEE的“地基”。

2.3.1 TrustZone(Cortex-A系列)

TrustZone把CPU核心分成两个“世界”:

  • Normal World(普通世界):跑Linux/Android
  • Secure World(安全世界):跑TEE OS

切换靠一条指令——SMC(Secure Monitor Call)。硬件上,TrustZone通过:

  • NS位(Non-Secure bit):标记内存和外设属于哪个世界
  • Monitor Mode:负责世界切换的“海关”
  • TZASC(TrustZone Address Space Controller):控制DDR内存区域的访问权限

来实现隔离。我刚开始做TEE时,一直搞不懂为什么SMC调用那么慢——后来测了一下,一次世界切换大概要几百个CPU周期。所以,别频繁切来切去,能批量处理就批量处理。

2.3.2 TrustZone-M(Cortex-M系列)

TrustZone-M是ARM针对MCU(微控制器)推出的简化版TrustZone。它和Cortex-A版的主要区别:

特性 TrustZone(Cortex-A) TrustZone-M(Cortex-M)
切换方式 SMC指令 + Monitor Mode SG指令 + SAU/IDAU
内存隔离 TZASC + MMU页表 SAU(Security Attribution Unit)
中断处理 GIC路由安全中断 NVIC + 安全中断号
典型场景 手机、平板、服务器 IoT设备、传感器、汽车ECU

TrustZone-M没有MMU,所以内存隔离靠SAU的“区域属性”来实现。说白了,就是给每块内存打个标签——是安全的还是非安全的。我在一个IoT项目里用过TrustZone-M,当时最头疼的是中断隔离:一个非安全中断如果误闯了安全内存,系统直接HardFault。嗯,调试这种问题,得有耐心。

注意: TrustZone-M的启动流程和Cortex-A完全不同。Cortex-A通常先跑BL1/BL2再切到TEE OS;Cortex-M则是直接从安全世界的Reset Vector启动。做启动适配时,一定要先确认你用的是A核还是M核。

2.4 架构总览图——一张图看懂TEE

下面这张图,是我自己画的一个TEE架构总览。它把上面讲的内容串在了一起。你盯着看两分钟,应该就能建立起整体印象。

TEE架构总览图 Normal World(普通世界) REE OS (Linux / Android / RTOS) Client App TEE Client API 共享内存(Shared Memory) SMC Secure World(安全世界) TEE OS (OP-TEE / Trusty / QSEE) Trusted Kernel(微内核) TA 1 TA 2 硬件隔离层 TrustZone TrustZone-M NS位 / TZASC / SAU / Monitor Mode

这张图里,你重点关注两个地方:

  • 中间的SMC箭头:这是两个世界唯一的“官方通道”。所有数据交换都得经过它。
  • 底部的硬件隔离层:TrustZone/TrustZone-M是TEE存在的物理基础。没有它,TEE OS就是个纸老虎。

好了,这一章的内容就这些。你先把架构图记在脑子里,后面讲启动流程时,我们会反复提到这些组件和它们之间的交互关系。