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 下。
下面这张图,帮你理清整个环境的依赖关系:
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能启动,而你自己写的代码该怎么放进去。
可可精品资料库