
01.环境搭建-UEFI笔记
Table of Contents
UEFI环境搭建
1.软件安装
- windows下
- VSCODE
- WSL (LINUX Ubuntu 24.04.2 LTS (GNU/Linux 5.15.167.4-microsoft-standard-WSL2 x86_64))
- 在Microsoft Store安装Ubuntu
- vscode 安装wsl插件
2. 安装环境依赖
2.1 git安装
- 打开Linux系统的终端,运行
sudo apt install git
git --version
- 成功会输出git版本
- git version 2.43.0
2. 按照python3
# 安装python3,一定要是 3.x.x 版本
sudo apt install python3
# 查看版本号确认安装成功
python3 --version
输出结果
Reading package lists... Done Building dependency tree... Done Reading state information... Done python3 is already the newest version (3.12.3-0ubuntu2). python3 set to manually installed. The following package was automatically installed and is no longer required: libwrap0 Use 'sudo apt autoremove' to remove it. 0 upgraded, 0 newly installed, 0 to remove and 121 not upgraded. root@Crypto:~# python3 --version Python 3.12.3
由于Linux系统自带了一个python2,所以还要建立python3与python的软链接,否则python命令还是调用的python2,只能用python3命令调用,会导致edk2编译失败。
找到python软连接的位置 ( /usr/bin/ )
删除旧的python软连接
# 打开终端,进入管理员模式 sudo -i # 进入目标文件夹 cd /usr/bin/ # 删除python软连接 sudo rm -rf python
构建新的python软连接
# 与python3.6建立软连接 sudo ln -s /usr/bin/python3.6 /usr/bin/python # 验证输出 python --version
(注)WSL 的 Ubuntu 子系统中启用图形化界面
如果你使用的是 Windows 11 及以上版本:
- 确保你的 WSL 和 Ubuntu 是最新版本:
- 打开 PowerShell 并运行
wsl --update
来更新 WSL 到最新版本。 - 更新你的 Ubuntu 发行版:在 WSL 中运行
sudo apt update && sudo apt upgrade
。
- 打开 PowerShell 并运行
- 安装 GUI 应用程序:
- 安装你想要使用的任何 GUI 应用程序。例如,要安装 Gedit 文本编辑器,可以在 WSL 终端中输入
sudo apt install gedit
。
- 安装你想要使用的任何 GUI 应用程序。例如,要安装 Gedit 文本编辑器,可以在 WSL 终端中输入
- 启动 GUI 应用程序:
- 直接在 WSL 终端中输入应用程序名称(如
gedit
),然后按回车键。如果一切配置正确,GUI 应用程序应该会在 Windows 桌面上弹出。
- 直接在 WSL 终端中输入应用程序名称(如
如果你使用的是不支持 WSLg 的旧版本 Windows 或者希望手动配置:
安装一个 X Server:
- 在 Windows 上安装一个 X Server,比如 VcXsrv 或 Xming。
配置 DISPLAY 环境变量:
在 WSL 中设置 DISPLAY 环境变量。你可以通过在
.bashrc
文件中添加以下行来实现这一点:
深色版本
export DISPLAY=$(grep -oP '(?<=nameserver ).+' /etc/resolv.conf):0
或者简单地在终端中执行
export DISPLAY=localhost:0
(假设你的 X Server 正在本地监听)。
允许连接到 X Server:
- 根据所使用的 X Server,可能需要禁用访问控制或以其他方式允许来自 WSL 的连接。
启动 GUI 应用程序:
- 启动你的 X Server,然后在 WSL 中运行 GUI 应用程序。
- 确保你的 WSL 和 Ubuntu 是最新版本:
图形化文件管理工具
#sudo apt install x11-apps #sudo apt install nautilus sudo apt install thunar thunar
3. 安装UUID-DEV、NASM、BISON、FLEX
下载各项依赖
# 下载各项依赖 sudo apt-get install uuid-dev nasm bison flex
4. 安装GCC、MAKE
sudo apt-get install build-essential gcc --version make --version
5.(排坑)安装 X11 库及其扩展,否则edk2编译会报错
# 安装X11库及其扩展,因为编译模拟器的过程中有源代码需要使用 # #include <X11/**> sudo apt-get install libx11-dev x11proto-xext-dev libxext-dev
将 NASM 更新到 2.15.x 以上版本,当前的edk2项目需要依赖nasm2.15以上版本,否则编译会报错
6. 下载EDK2项目以及必要的开发包
# 进入桌面,新建一个文件夹,我的是UEFI,进入这个文件夹
cd /home/dev/UEFI
# 从git上拉取EDK2项目文件
git clone http://github.com/tianocore/edk2.git
git clone http://github.com/tianocore/edk2-libc.git
git clone http://github.com/acpica/acpica.git
# 然后进入edk2文件夹执行update
cd edk2
git submodule update --init
# 这一步会等待较长时间,一定要update成功,否则会编译失败
# 因为git项目中很多应用的第三方插件库是以链接的形式存在的
# clone时不会把链接的文件下载,只能通过update下载包含的链接文件
3. 编译相关工具
1. 编译ACPICA生成ISAL编译器开发包
# 进入UEFI文件夹
cd /home/dev/UEFI/
make -C ./acpica/
2.编译BaseTools
# 进入edk2文件夹
cd edk2/
make -C edk2/BaseTools
遇到错误
root@Crypto:/home/dev# cd edk2 root@Crypto:/home/dev/edk2# make -C BaseTools make: Entering directory '/home/dev/edk2/BaseTools' make -C Source/C make[1]: Entering directory '/home/dev/edk2/BaseTools/Source/C' Attempting to detect HOST_ARCH from 'uname -m': x86_64 Detected HOST_ARCH of X64 using uname. mkdir -p . make -C Common make[2]: Entering directory '/home/dev/edk2/BaseTools/Source/C/Common' ar crs ../libs/libCommon.a BasePeCoff.o BinderFuncs.o CommonLib.o Crc32.o Decompress.o EfiCompress.o EfiUtilityMsgs.o FirmwareVolumeBuffer.o FvLib.o MemoryFile.o MyAlloc.o OsPath.o ParseGuidedSectionTools.o ParseInf.o PeCoffLoaderEx.o SimpleFileParsing.o StringFuncs.o TianoCompress.o make[2]: Leaving directory '/home/dev/edk2/BaseTools/Source/C/Common' make -C BrotliCompress make[2]: Entering directory '/home/dev/edk2/BaseTools/Source/C/BrotliCompress' gcc -c -I ./brotli/c/include -I .. -I ../Include/Common -I ../Include/ -I ../Include/IndustryStandard -I ../Common/ -I .. -I . -I ../../../../MdePkg/Include/X64/ -I ../../../../MdePkg/Include -MD -fshort-wchar -fno-strict-aliasing -fwrapv -fno-delete-null-pointer-checks -Wall -Werror -Wno-deprecated-declarations -Wno-stringop-truncation -Wno-restrict -Wno-unused-result -nostdlib -g -O2 BrotliCompress.c -o BrotliCompress.o BrotliCompress.c:20:10: fatal error: ./brotli/c/common/constants.h: No such file or directory 20 | #include "./brotli/c/common/constants.h" | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated. make[2]: *** [../Makefiles/footer.makefile:21: BrotliCompress.o] Error 1 make[2]: Leaving directory '/home/dev/edk2/BaseTools/Source/C/BrotliCompress' make[1]: *** [GNUmakefile:79: BrotliCompress] Error 2 make[1]: Leaving directory '/home/dev/edk2/BaseTools/Source/C' make: *** [GNUmakefile:19: Source/C] Error 2 make: Leaving directory '/home/dev/edk2/BaseTools'
编译器找不到
brotli
库中的头文件,具体是:- ./brotli/c/common/constants.h
- 而这个目录或文件 不存在于你的 EDK II 源码中。
- 这是因为在较新的 EDK II 分支中(如
develop
或edk2-stable202311
),brotli
子模块是以 Git Submodule 的方式引入的。如果你克隆项目时没有使用--recursive
参数,或者没有手动更新子模块,就会缺少这些依赖。
解决方法:同步 Git 子模块
# 回到 EDK II 根目录 cd /home/dev/edk2 # 初始化并更新子模块(特别是 brotli) git submodule init git submodule update
3. 新建 myexport.sh 文件
进入桌面UEFI文件夹
- cd /home/dev/UEFI
新建myexport.sh,并打开
- vim myexport.sh
- 输入以下内容
export WORKSPACE=$PWD export PACKAGES_PATH=$PWD/edk2:$PWD/edk2-libc export IASL_PREFIX=$PWD/acpica/generate/unix/bin/ export PYTHON_COMMAND=/usr/bin/python3 export GCC5=/usr/bin/gcc
4. 编译Emulator模拟器
cd /home/dev/UEFI/
source myexport.sh
source edk2/edksetup.sh
build -p edk2/EmulatorPkg/EmulatorPkg.dsc -t GCC5 -a X64
5. 编译UEFI程序
cd /home/dev/UEFI/
build -p edk2-libc/AppPkg/AppPkg.dsc -t GCC5 -a X64
4. 运行模拟器执行UEFI程序
# 进入编译bild目录
cd /hone/dev/UEFI/Build/EmulatorX64/DEBUG_GCC5/X64/
# 执行Host文件
./Host
- 在UEFI系统中输入 ***fs0:***进入虚拟器的工作目录:
- 输入对应的.efi执行
5.开发流程
UEFI模拟器的 fs0: 对应的文件目录为 桌面/UEFI/Build/EmulatorX64/DEBUG_GCC5/X64/
- 其中,用户自定义的.efi文件为Hello.efi和Main.efi,其他为系统文件。
开发时,要进入 UEFI/edk2-libc/AppPkg/Applicayions 目录,修改Hello或Main文件夹中的 .c 文件,二者的区别在于依赖的库文件不同。Hello的依赖库相对较小,而Main的依赖库为C语言标准库,更多具体信息可以参考 UEFI/edk2-libc/AppPkg/ReadMe.txt
代码编写完毕后,重新编译。执行
cd /home/dev/UEFI/ source myexport.sh source edk2/edksetup.sh # 执行build前必须加上上边的两条source语句 build -p edk2-libc/AppPkg/AppPkg.dsc -t GCC5 -a X64
将build生成的Hello.efi或者是Main.efi(根据自己的设置走)文件,移动到 模拟器工作目录
build结果文件路径:桌面/UEFI/Build/AppPkg/DEBUG_GCC5/X64/
模拟器工作路径 :桌面/UEFI/Build/EmulatorX64/DEBUG_GCC5/X64/
移动文件可以热操作,即不需要关闭模拟器就可以移动.efi文件。移动后,再次输入文件名字即可运行。