2. 开发环境准备

说实话,做TEE开发最怕什么?不是代码写不出来,而是环境没搭好,折腾半天连编译都过不了。我见过太多新手卡在这一步,最后放弃了。所以这一章,咱们把地基打牢。

我个人习惯用Ubuntu 20.04 LTS作为开发机。为什么选它?因为ATF官方长期测试的就是这个版本,你换太新的反而容易踩坑。嗯,这里要注意,别用Windows直接搞,交叉编译环境会让你崩溃的。

2.1 虚拟机搭建——别偷懒,用对的版本

我推荐用VMware Workstation或者VirtualBox。如果你问我选哪个?我偏向VMware,稳定性更好。但VirtualBox免费,也够用。

具体步骤我就不啰嗦了,说几个关键点:

  • 内存分配:至少4GB,我建议8GB。编译ATF时内存不够会卡死。
  • 磁盘空间:至少40GB。你以为源码很小?加上工具链、编译中间文件,轻松上10GB。
  • CPU核心:分配2核以上,编译能快不少。
我的小技巧:装完Ubuntu后,第一件事换国内源。不然apt下载慢到你怀疑人生。我用的是清华源,速度杠杠的。

2.2 必要工具链安装——gcc、make、git

好,虚拟机跑起来了。接下来装工具。你想想看,没有编译器,代码怎么变成二进制?

打开终端,执行以下命令:

sudo apt update
sudo apt upgrade -y
sudo apt install -y build-essential git gcc make python3 python3-pip

这里有个坑——build-essential这个包已经包含了gcc和make,但有些同学会漏掉。我曾经遇到过一位学员,只装了gcc没装make,结果makefile跑不起来,查了半天。

验证一下安装是否成功:

gcc --version
make --version
git --version

看到版本号输出,就说明装好了。

注意:ATF对gcc版本有要求。我建议用gcc 9.x或10.x。太新的版本(比如12.x)可能会有兼容性问题。我曾经在gcc 12上编译ATF,报了一堆莫名其妙的警告,最后降级才解决。

2.3 源码下载——从官方仓库拉取

工具链装好了,接下来下载ATF源码。我习惯用git clone,方便后续更新和切换分支。

mkdir -p ~/tee_workspace
cd ~/tee_workspace
git clone https://github.com/ARM-software/arm-trusted-firmware.git

如果你网络不好,可以用国内镜像。我个人推荐gitee上的同步仓库:

git clone https://gitee.com/mirrors/arm-trusted-firmware.git

下载完成后,进入目录看看:

cd arm-trusted-firmware
ls -la

2.4 目录结构——别迷路

ATF的目录结构,说白了就是一套清晰的模块划分。我第一次看的时候也觉得眼花,但摸清楚规律后就好办了。

核心目录如下:

目录/文件 作用
bl1/ Boot Loader阶段1——最底层的启动代码
bl2/ Boot Loader阶段2——负责加载后续镜像
bl31/ Boot Loader阶段3——运行时服务,TEE核心就在这里
bl32/ Boot Loader阶段3的SP(安全分区)——可选
plat/ 平台相关代码——不同开发板在这里适配
drivers/ 驱动代码——比如GIC、UART等
lib/ 通用库——比如c库、xlat表等
tools/ 辅助工具——比如证书生成、镜像打包
Makefile 编译入口——整个项目的构建脚本

我刚开始做ATF集成时,最常打交道的是plat/和bl31/这两个目录。说白了,你要移植到新板子,主要改的就是plat/下面的代码。

核心逻辑图:ATF的启动流程与目录对应关系

ATF启动流程与目录对应关系 BL1 bl1/ 目录 BL2 bl2/ 目录 BL31 bl31/ 目录 BL32 bl32/ 平台适配层:plat/ 目录(不同开发板在这里实现) 驱动层:drivers/ 目录 通用库:lib/ 目录 工具链:tools/ 目录 + Makefile 构建入口

你看这张图,ATF的启动是分阶段的。BL1是最底层,负责初始化硬件,然后跳转到BL2。BL2负责加载后续镜像,最后进入BL31(运行时服务)。BL32是可选的,如果你需要TEE,就在这里实现。

我当年第一次移植ATF到自家板子时,就是照着这个结构,先在plat/下新建了一个目录,然后一步步实现每个阶段的回调函数。说白了,ATF的框架设计得很清晰,你只要按规矩来,就不会出大问题。

2.5 验证环境——跑一个简单的编译

环境搭好了,总得试试能不能用。咱们先编译一个最简版本:

cd ~/tee_workspace/arm-trusted-firmware
make PLAT=fvp DEBUG=1

这里PLAT=fvp是指定目标平台为FVP(Fixed Virtual Platform),是ARM官方的虚拟平台。第一次编译会下载一些依赖,耐心等几分钟。

如果编译成功,你会看到类似这样的输出:

Built build/fvp/debug/bl1.bin
Built build/fvp/debug/bl2.bin
Built build/fvp/debug/bl31.bin

看到这三个bin文件,恭喜你,环境搭建成功了!

避坑指南:如果编译报错说缺少某个头文件,多半是依赖没装全。我曾经遇到过mbedtls缺失的问题,执行sudo apt install libmbedtls-dev就解决了。

好,到这里开发环境就准备好了。下一章咱们开始真正动手,写第一个TEE示例程序。

可可精品资料库