2. 环境搭建

说实话,很多初学者在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没装。我曾经在换了一台新电脑后,忘了装这个包,折腾了半小时才想起来。

六、知识体系总览

下面这张图总结了本章的核心逻辑,你对照着看会更清楚:

ATF编译环境搭建知识体系 基础系统依赖 build-essential, git, python3 ATF源码获取 Git clone LTS分支 交叉编译工具链 aarch64-linux-gnu-gcc libssl-dev, dtc plat/ 目录结构了解 版本选择(推荐10.x) 验证:make PLAT=qemu DEBUG=1 生成 bl1.bin, bl2.bin, bl31.bin 环境就绪,可以开始移植工作

这张图把环境搭建的三个核心模块串起来了。你从左边开始,依次安装基础依赖、下载源码、配置工具链,最后用QEMU平台验证。每一步都验证通过后,你的开发环境就准备好了。

七、常见问题速查

问题现象 可能原因 解决办法
编译报错:找不到编译器 工具链未安装或PATH未设置 检查 which aarch64-linux-gnu-gcc
编译报错:openssl头文件缺失 缺少libssl-dev sudo apt install libssl-dev
链接阶段报错:对齐方式问题 工具链版本过新 换用gcc 10.x或11.x
Git clone速度慢 网络问题 使用代理或国内镜像

嗯,环境搭建这部分其实不难,但细节很多。你只要按照上面的步骤一步步来,基本不会出问题。如果真遇到奇怪的错误,别慌——先检查工具链版本,再检查依赖包,90%的问题都出在这两个地方。