2、搭建开发环境:安装EDK2、配置编译工具链、验证环境是否正常

好,咱们正式开始动手了。

这一章的目标很明确:在你的电脑上把UEFI开发环境跑起来。说白了,就是装好EDK2、配好编译工具链,然后编译一个最简单的固件,确认一切正常。

我见过太多新手卡在这一步——不是装错版本,就是路径配不对。嗯,别担心,跟着我来,半小时内搞定。

2.1 环境概览:我们需要什么?

先看看整个开发环境的构成。我习惯把它分成三层:

  • 基础系统:Linux(推荐Ubuntu 20.04/22.04 LTS)或Windows + WSL2
  • 编译工具链:GCC(Linux)或VS2019+(Windows)
  • EDK2框架:TianoCore官方仓库,包含UEFI规范实现和构建系统

你想想看,EDK2本身不生产代码,它只是个「骨架」。真正的编译工作,靠的是底层的GCC或MSVC。所以工具链配不对,后面全白搭。

核心原则:EDK2对路径非常敏感。不要用中文路径,不要有空格,不要放在桌面。我建议统一放在 ~/workspace/edk2 下。

下面这张图,帮你理清整个环境的依赖关系:

UEFI开发环境架构 操作系统(Ubuntu 22.04 / WSL2) 编译工具链(GCC 5.4+ / VS2019) EDK2 框架(edk2-stable202311) UEFI固件(.efi / .fd) 提供编译器、链接器 提供构建系统、库、协议 最终产物

2.2 安装EDK2

EDK2的安装,其实就是从GitHub克隆代码。但要注意版本——我踩过坑,用最新master分支有时候会碰到不稳定的提交。

我建议:使用稳定标签版本。目前推荐 edk2-stable202311。

# 创建目录
mkdir -p ~/workspace
cd ~/workspace

# 克隆EDK2(带子模块)
git clone https://github.com/tianocore/edk2.git -b edk2-stable202311
cd edk2

# 更新子模块(这一步不能省!)
git submodule update --init --recursive

小技巧:如果网络慢,可以用 --depth 1 只克隆最新提交。但子模块必须完整拉取,否则编译会报错。

克隆完成后,你会看到这样的目录结构:

edk2/
├── BaseTools/        # 构建工具(C语言写的)
├── MdePkg/           # 核心头文件和库
├── MdeModulePkg/     # 模块实现
├── UefiCpuPkg/       # CPU相关
├── NetworkPkg/       # 网络协议栈
├── ShellPkg/         # UEFI Shell
├── OvmfPkg/          # QEMU虚拟机固件(我们待会就用它)
└── ...

2.3 配置编译工具链

EDK2支持多种工具链。在Linux上,我们使用GCC。在Windows上,用VS2019或VS2022。

2.3.1 Linux环境(推荐)

安装必要的包:

sudo apt update
sudo apt install -y build-essential uuid-dev nasm python3 python3-pip

这里有个关键点:nasm 是汇编器,UEFI启动代码里有很多汇编片段。我曾经漏装它,结果编译到一半报错,排查了半天。

验证工具链:

gcc --version
nasm --version
python3 --version

2.3.2 Windows环境

如果你用Windows,我建议走WSL2路线。原生Windows编译EDK2虽然可行,但坑比较多——路径分隔符、换行符、权限问题,够你喝一壶的。

当然,如果你坚持用原生Windows:

  • 安装 Visual Studio 2019(社区版免费)
  • 安装 Python 3.10+
  • 安装 NASM(记得加到PATH)
  • 安装 Git for Windows

注意:Windows路径不要超过260字符。EDK2的目录嵌套很深,我遇到过路径太长导致编译失败的情况。解决方案:把仓库放在盘符根目录下,比如 C:\edk2。

2.4 编译EDK2基础工具

EDK2的构建系统本身是用C语言写的,需要先编译它。

cd ~/workspace/edk2
make -C BaseTools

编译完成后,设置环境变量:

export EDK_TOOLS_PATH=$PWD/BaseTools
export PATH=$EDK_TOOLS_PATH/Source/C/bin:$PATH

为了方便,我习惯把这行加到 ~/.bashrc 里:

echo 'export EDK_TOOLS_PATH=$HOME/workspace/edk2/BaseTools' >> ~/.bashrc
echo 'export PATH=$EDK_TOOLS_PATH/Source/C/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

2.5 验证环境:编译OVMF

环境配没配好,拉出来遛遛。我们编译一个OVMF(Open Virtual Machine Firmware),这是QEMU虚拟机用的UEFI固件。

cd ~/workspace/edk2

# 设置EDK2环境
source edksetup.sh

# 编译OVMF(X64架构)
build -a X64 -t GCC5 -p OvmfPkg/OvmfPkgX64.dsc -b DEBUG

第一次编译会比较慢,大概5-10分钟。因为要编译EDK2的基础库和协议栈。

编译成功后,你会看到:

Build end time: 14:32:18, Mar.15 2024
Build total time: 00:05:23

产物在 Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd。

验证方法:用QEMU启动这个固件,看看UEFI Shell能不能跑起来。

# 安装QEMU
sudo apt install -y qemu-system-x86

# 启动OVMF
qemu-system-x86_64 -bios Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd -m 1024

如果看到UEFI Shell的界面,或者至少没有报错退出,恭喜你——环境搭建成功!

2.6 常见问题与避坑

我在带团队时,发现新手最容易栽在下面几个地方:

问题 现象 解决方案
Python版本不对 编译时报语法错误 确保Python 3.6+,且 python3 命令可用
子模块未更新 找不到 BaseCryptLib.h 执行 git submodule update --init --recursive
NASM未安装 汇编文件编译失败 sudo apt install nasm
路径包含中文 编译到一半卡死 把仓库移到纯英文路径下

我曾经遇到过最诡异的问题:在Windows上编译,明明所有工具都装了,就是报链接错误。后来发现是杀毒软件把临时文件锁了。关掉杀毒软件,一切正常。嗯,这种玄学问题,遇到了别慌,先看看是不是环境干扰。

2.7 本章小结

到这步,你的开发环境已经就绪了。我们做了三件事:

  • 安装了EDK2框架(稳定版)
  • 配置了GCC工具链(或VS2019)
  • 编译了OVMF并验证通过

说白了,环境搭建就是「装软件、配路径、跑编译」这三板斧。后面所有章节的代码,都跑在这个环境之上。所以这一步务必走稳。

下一章,我们会解剖EDK2的目录结构,看看每个Package是干什么的。到时候你就知道,为什么OVMF能启动,而你自己写的代码该怎么放进去。

可可精品资料库