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最核心的部分是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)。流程大概是:
- 正常世界的应用调用TEE驱动
- TEE驱动执行SMC指令,触发异常
- CPU陷入Monitor Mode,ATF接管
- ATF判断是哪个安全服务,转发给TEE
- TEE处理完,通过ATF返回结果
- 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的编译环境搭建和最小系统移植。
可可精品资料库