环境搭建:搭建ATF编译环境、下载ATF源码、安装交叉编译工具链
说实话,很多初学者在ATF移植上栽跟头,不是代码看不懂,而是环境没搭对。我见过太多人花了一周时间折腾编译错误,最后发现是工具链版本不匹配。所以这一章,咱们把地基打牢。
一、整体思路
ATF的编译环境,说白了就三样东西:源码、交叉编译工具链、必要的系统库。这三样配齐了,你就能在PC上编译出能在ARM开发板上运行的固件。
我个人习惯在Ubuntu 20.04 LTS上做开发。为什么选它?因为社区支持最好,遇到问题搜一下基本都有答案。你如果用的是其他发行版,原理一样,就是包管理器的命令略有不同。
核心依赖清单:
- Git(下载源码)
- GCC、make、build-essential(基础编译工具)
- 交叉编译工具链(aarch64-linux-gnu-* 系列)
- Python 3、device-tree-compiler(DTB处理用)
二、安装基础依赖包
先别急着下载ATF,咱们把系统环境收拾干净。打开终端,执行以下命令:
sudo apt update
sudo apt install -y build-essential git gcc make python3 python3-pip \
device-tree-compiler libssl-dev
这里有个坑——libssl-dev。ATF在编译某些平台时需要OpenSSL的头文件,如果你漏掉这个包,编译到一半会报错说找不到openssl/xxx.h。我曾经因为这个卡了半小时,后来才发现是依赖没装全。
小技巧:如果你用的是Ubuntu 22.04或更新版本,可能需要额外安装libpython3-dev,否则Python相关的脚本会报错。
三、下载ATF源码
ATF的官方仓库在GitHub上,地址是:https://github.com/ARM-software/arm-trusted-firmware。我个人建议直接克隆最新的release分支,而不是master分支。为什么?因为master分支可能包含正在开发中的代码,稳定性没保障。
git clone https://github.com/ARM-software/arm-trusted-firmware.git -b lts-v2.8
这里我选了lts-v2.8分支,这是目前比较稳定的长期支持版本。你如果做产品开发,建议也选LTS版本。如果只是学习,选最新的release也没问题。
下载完成后,进入目录看看结构:
cd arm-trusted-firmware
ls -l
你会看到bl1、bl2、bl31、plat等目录。嗯,这里要注意,plat目录下存放的是各平台相关的代码,我们后续的移植工作主要就在这里展开。
四、安装交叉编译工具链
ATF是为ARM架构设计的,而你的PC通常是x86架构。所以我们需要交叉编译工具链,让PC生成ARM架构的机器码。
我推荐使用ARM官方提供的GNU Arm Embedded Toolchain。对于64位的ARMv8平台(也就是我们课程主要针对的平台),需要安装aarch64-none-elf-或aarch64-linux-gnu-系列。
两种方式安装:
方式一:apt直接安装(推荐新手)
sudo apt install -y gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu
安装完成后,验证一下:
aarch64-linux-gnu-gcc --version
如果能看到版本信息,说明安装成功。这种方式最简单,但版本可能不是最新的。
方式二:手动下载ARM官方工具链(推荐进阶用户)
去ARM官网下载gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz,然后解压到/opt目录:
sudo tar -xvf gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz -C /opt/
export PATH=$PATH:/opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin
记得把export命令加到~/.bashrc里,否则每次打开终端都要重新设置。
注意:工具链版本不要选太新的。我遇到过用gcc 12.x编译ATF,结果链接阶段报错说某些段对齐方式不兼容。最后换回gcc 10.x就一切正常。ATF对工具链版本比较敏感,建议用10.x或11.x系列。
五、验证编译环境
环境搭好了,咱们跑一个简单的编译试试。以QEMU平台为例:
make CROSS_COMPILE=aarch64-linux-gnu- PLAT=qemu DEBUG=1
如果一切顺利,你会看到编译输出,最后生成build/qemu/debug/bl1.bin、bl2.bin、bl31.bin等文件。
我第一次编译ATF时,看到满屏的编译信息滚动,心里还是挺激动的。这意味着你的环境已经可以正常工作了。
避坑指南:如果编译报错说aarch64-linux-gnu-gcc: command not found,说明工具链没加到PATH里。如果报错说fatal error: openssl/xxx.h: No such file or directory,说明libssl-dev没装。我曾经在换了一台新电脑后,忘了装这个包,折腾了半小时才想起来。
六、知识体系总览
下面这张图总结了本章的核心逻辑,你对照着看会更清楚:
这张图把环境搭建的三个核心模块串起来了。你从左边开始,依次安装基础依赖、下载源码、配置工具链,最后用QEMU平台验证。每一步都验证通过后,你的开发环境就准备好了。
七、常见问题速查
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 编译报错:找不到编译器 | 工具链未安装或PATH未设置 | 检查 which aarch64-linux-gnu-gcc |
| 编译报错:openssl头文件缺失 | 缺少libssl-dev | sudo apt install libssl-dev |
| 链接阶段报错:对齐方式问题 | 工具链版本过新 | 换用gcc 10.x或11.x |
| Git clone速度慢 | 网络问题 | 使用代理或国内镜像 |
嗯,环境搭建这部分其实不难,但细节很多。你只要按照上面的步骤一步步来,基本不会出问题。如果真遇到奇怪的错误,别慌——先检查工具链版本,再检查依赖包,90%的问题都出在这两个地方。
环境搭好了,下一章我们就可以真正开始分析ATF的启动流程了。到时候你会看到,代码是怎么从BL1一步步跑到BL31的。