1. ATF 概述:ARM Trusted Firmware 的起源与定位
各位同学,咱们今天聊聊 ATF。ARM Trusted Firmware,圈里人都叫它 ATF。这东西到底是什么?说白了,它是 ARM 官方维护的一套开源固件,专门给 ARM 架构的芯片提供安全启动和安全运行环境。
我记得 2014 年刚接触这玩意儿时,ARM 生态里还没有统一的安全固件标准。各家芯片厂自己搞一套,兼容性差,问题也多。后来 ARM 推出 ATF,算是把这块给统一了。
1.1 ATF 在 ARM 生态中的定位
ARM 生态里,软件栈分好几层。最底层是硬件,往上就是固件。ATF 就卡在硬件和操作系统之间。你想想看,手机开机时,从按下电源键到进入 Android 系统,中间那段时间就是 ATF 在干活。
它的定位很明确:为 ARM 架构提供可信执行环境的基础设施。具体来说,它负责三件事:
- 安全启动:确保启动链上的每个镜像都是可信的
- 运行时安全服务:提供安全监控模式下的服务调用
- 电源管理:处理 CPU 的休眠、唤醒等底层操作
核心观点:ATF 不是操作系统,也不是 bootloader。它是连接硬件和高级软件的安全桥梁。没有它,ARM 芯片的安全特性就发挥不出来。
1.2 ATF 的起源故事
ATF 最早是 ARM 内部的一个项目。2013 年,ARM 发布 ARMv8-A 架构,引入了异常级别模型。这个模型把 CPU 运行模式分成 EL0 到 EL3 四个级别。EL3 是最高权限,专门跑安全监控代码。
问题来了:EL3 的代码谁来写?各家芯片厂自己写的话,质量参差不齐,安全漏洞也多。ARM 索性自己搞了一套参考实现,就是 ATF。2014 年开源,托管在 GitHub 上。
我在项目中遇到过一件事:某客户用的芯片是自家写的 EL3 固件,结果发现安全漏洞,需要打补丁。折腾了两个月才搞定。后来他们直接切到 ATF,省心多了。
1.3 ATF 的主要功能模块
ATF 不是一个大而全的怪物。它分模块,每个模块干自己的事。我习惯把它分成四个核心部分:
| 模块 | 功能 | 对应代码目录 |
|---|---|---|
| BL1 | 第一级启动加载器,负责初始化最小硬件环境 | bl1/ |
| BL2 | 第二级启动加载器,负责加载和验证后续镜像 | bl2/ |
| BL31 | 运行时固件,运行在 EL3,提供安全监控服务 | bl31/ |
| BL32 | 安全分区固件,运行在 S-EL1,提供可信 OS 环境 | bl32/ |
嗯,这里要注意:BL32 是可选的。有些场景不需要可信 OS,那就只用到 BL31。我在做 IoT 项目时就只用了 BL1 + BL2 + BL31,省掉 BL32 能省不少内存。
1.4 ATF 的启动流程概览
ATF 的启动流程,说白了就是一级一级往上跳。从 BL1 到 BL2,再到 BL31,最后到 BL32 和正常世界的 OS。每一级都验证下一级的签名,确保安全。
我画了一张图,帮你理解这个流程:
这张图里,BL1 是 ROM 里的代码,芯片出厂就固化好了。BL2 是第二级,负责加载 BL31 和 BL32。BL31 是运行时固件,一直待在 EL3 里提供服务。BL32 是可选的可信 OS,比如 OP-TEE。
小提示:实际项目中,BL1 通常由芯片厂商提供,用户能改的只有 BL2 和 BL31。我曾经在调试时发现 BL1 有个 bug,但因为是 ROM 代码,没法改,只能绕过去。所以选芯片时,BL1 的成熟度很重要。
1.5 ATF 的安全架构基础
ATF 的安全架构,核心是 ARM 的异常级别模型。ARMv8-A 定义了四个异常级别:
- EL0:用户态应用,权限最低
- EL1:操作系统内核,如 Linux
- EL2:虚拟化层,如 Hypervisor
- EL3:安全监控,ATF 的主场
为什么会这样设计?因为安全需要隔离。EL3 的代码可以访问所有资源,EL0 的代码只能访问自己的那点东西。ATF 就运行在 EL3,负责管理这些权限。
我建议你记住一句话:ATF 是 ARM 安全世界的看门人。所有安全相关的操作,都要经过它。
注意事项:ATF 的代码运行在 EL3,一旦出 bug,整个系统就挂了。我曾经在调试时不小心写了个死循环,结果芯片直接锁死,只能重新上电。所以写 ATF 代码时,一定要小心再小心。
1.6 ATF 的代码结构
ATF 的代码在 GitHub 上,地址是 https://github.com/ARM-software/arm-trusted-firmware。它的目录结构很清晰:
arm-trusted-firmware/
├── bl1/ # BL1 源码
├── bl2/ # BL2 源码
├── bl31/ # BL31 源码
├── bl32/ # BL32 源码
├── common/ # 公共代码
├── drivers/ # 驱动
├── include/ # 头文件
├── lib/ # 库
├── plat/ # 平台相关代码
└── tools/ # 工具
每个平台都有自己的目录,比如 plat/arm/ 是 ARM 官方开发板,plat/mediatek/ 是联发科,plat/rockchip/ 是瑞芯微。我习惯先看 plat/ 目录,了解平台差异。
1.7 为什么学习 ATF
你可能想问:我为什么要学 ATF?
原因有三:
- 安全需求:现在的设备越来越注重安全,ATF 是 ARM 安全的基础
- 职业发展:懂 ATF 的工程师不多,但需求很大
- 技术深度:ATF 涉及底层硬件、安全、操作系统,能帮你打通技术栈
我记得有个朋友,之前做应用开发,后来转做 ATF,薪资直接翻倍。当然,这行也不容易,调试起来很痛苦,但成就感也大。