1. ATF与TEE概述:ARM TrustZone技术背景、ATF架构简介、TEE概念、ATF与TEE的关系

1.1 为什么要有TrustZone?

先聊个背景。我记得2010年左右,移动设备开始爆发,但安全问题也跟着来了。普通操作系统太庞大,攻击面太多。你想想看,一个Linux内核几千万行代码,谁能保证没漏洞?

ARM公司想了个办法——既然软件防不住,那就从硬件层面隔离。这就是TrustZone的初衷。

说白了,TrustZone把CPU分成了两个世界:

  • 正常世界(Normal World):跑你的Android、Linux、RTOS
  • 安全世界(Secure World):跑可信应用、密钥管理、指纹处理

这两个世界通过硬件强制隔离。普通世界的程序,无论如何都访问不了安全世界的内存。我在项目中遇到过有人问:「那我把安全世界的物理地址算出来,直接读行不行?」——不行,TrustZone在总线层面就给你拦住了。

核心要点:TrustZone不是软件方案,是硬件隔离。它修改了ARM的AMBA总线协议,在总线传输时加了一个NS位(Non-Secure)。这个位为0表示安全访问,为1表示非安全访问。总线控制器看到非安全访问请求安全内存,直接返回错误。

1.2 ATF架构简介

ARM Trusted Firmware,简称ATF。我习惯叫它「固件界的瑞士军刀」。

ATF是ARM官方提供的开源参考实现,专门跑在安全世界。它负责什么呢?

  • 系统启动时的安全初始化
  • 安全监控模式(Monitor Mode)的切换
  • 电源管理、PSCI(Power State Coordination Interface)
  • 安全中断处理
  • 与TEE的交互接口

ATF的架构分几个层级,我画个图帮你理解:

ATF 架构层级图 正常世界 (Normal World) 安全世界 (Secure World) 用户应用 / 普通OS Android / Linux / RTOS 可信应用 (TA) 指纹支付 / DRM / 密钥管理 内核 / 驱动 OP-TEE 驱动 / 安全监控调用 TEE 内核 (如 OP-TEE) 可信内核 / 安全存储 / 密码学 ARM Trusted Firmware (ATF) 安全监控模式 (Monitor Mode) / SMC 处理 / PSCI / 安全中断 ARM 硬件平台 (Cortex-A / Cortex-M) TrustZone 硬件扩展 / GIC / 内存控制器 SMC SMC 应用层 内核层 固件层 硬件层

ATF最核心的部分是BL(Boot Loader)系列:

组件 全称 职责
BL1 Boot Loader Stage 1 ROM代码,不可修改。负责初始化CPU、加载BL2
BL2 Boot Loader Stage 2 可信启动,验证BL31/BL32/BL33的签名
BL31 Runtime Firmware 运行时的安全监控,处理SMC异常、PSCI
BL32 Secure Payload 就是TEE本身(如OP-TEE、Trusty)
BL33 Non-Trusted Firmware 正常世界的bootloader(如U-Boot)

个人经验:调试ATF启动时,我最常看的就是BL31的日志。如果BL31起不来,后面全白搭。建议你在开发板上先跑通ATF的最小配置,再往上加TEE。

1.3 TEE是什么?

TEE,Trusted Execution Environment,可信执行环境。嗯,这个名字起得挺直白——就是一个「可信」的「执行环境」。

它和普通OS的区别在哪?我列个表:

对比项 普通OS (REE) TEE
运行位置 正常世界 安全世界
内存访问 只能访问非安全内存 可访问安全和非安全内存
中断处理 普通中断 安全中断(FIQ)
典型实现 Linux、Android OP-TEE、Trusty、QSEE
安全等级 低(攻击面大) 高(硬件隔离)

TEE里跑的是可信应用(TA),比如:

  • 指纹比对——你的指纹数据不会泄露给Android
  • DRM解密——Netflix的视频密钥在TEE里处理
  • 移动支付——银行卡信息在TEE里加密
  • 密钥生成——硬件真随机数+安全存储

我曾经调试过一个支付相关的TA,发现TA在安全世界申请内存时,如果超过预设的堆大小,直接就panic了。这跟普通Linux的OOM完全不一样——TEE里没有swap,内存不够就是不够。

1.4 ATF和TEE到底是什么关系?

这个问题我经常被问到。说白了,ATF是「桥梁」,TEE是「房子」。

ATF负责:

  • 把CPU从正常世界切换到安全世界
  • 管理安全中断(FIQ)的路由
  • 提供PSCI让正常OS可以开关CPU核心
  • 加载和验证TEE的镜像

TEE负责:

  • 提供可信应用的运行环境
  • 管理安全内存和密码学资源
  • 处理来自正常世界的安全调用

它们之间的通信靠的是SMC指令(Secure Monitor Call)。流程大概是:

  1. 正常世界的应用调用TEE驱动
  2. TEE驱动执行SMC指令,触发异常
  3. CPU陷入Monitor Mode,ATF接管
  4. ATF判断是哪个安全服务,转发给TEE
  5. TEE处理完,通过ATF返回结果
  6. CPU切回正常世界,应用拿到结果

关键点:ATF和TEE是独立的两个固件。ATF是ARM官方的,TEE可以是OP-TEE(开源)、Trusty(Google)、QSEE(高通)等。它们通过标准接口对接——这个接口就是我们这门课要讲的核心。

1.5 实际项目中的坑

我踩过几个坑,分享给你:

坑1:ATF和TEE的版本不匹配。ATF 2.4和OP-TEE 3.12的接口有变化,直接编译会报错。建议你锁定版本组合,不要混搭。

坑2:安全内存配置。ATF里要配置TEE使用的安全内存范围,如果配小了,TEE启动时直接挂掉。我曾经因为这个查了两天,最后发现是内存基地址写错了。

建议:刚开始接触ATF+TEE,先用QEMU模拟器。不用买开发板,不用烧录,改代码-编译-运行,几分钟一轮。等逻辑跑通了,再上真板子。

好了,这一章我们理清了TrustZone的背景、ATF的架构、TEE的概念,以及它们怎么配合。下一章开始,我们就要动手写代码了——ATF的编译环境搭建和最小系统移植。


可可精品资料库