一、windows下编译环境搭建
1.1 软件环境
- 操作系统:windows10
- 编译器:VS2019
- Python38 :python-3.8.0-amd64.exe
- ASL :iasl-win-20210730.zip
- NASM :nasm-2.13.03-installer-x64.exe
- git
- qemu :qemu-w64-setup-20210825.exe
1.2 编译EmulatorPkg
1.2.1 下载最新edk2
从github的edk2仓库下载
git clone https://github.com/tianocore/edk2.git
1.2.2 修改.gitmodules 文件
下载的edk2里面会有一个.gitmodules 文件,国内同步不了.gitmodules里面子模块的内容,我把里面的子模块都同步到了我的gitee仓库里面,所以直接修改成gitee上面对应的链接就行。
[submodule "CryptoPkg/Library/OpensslLib/openssl"]
path = CryptoPkg/Library/OpensslLib/openssl
url = https://gitee.com/zl_work/edk_moudels_openssl.git
[submodule "SoftFloat"]
path = ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3
url = https://gitee.com/zl_work/edk_modules_berkeley-softfloat-3.git
[submodule "UnitTestFrameworkPkg/Library/CmockaLib/cmocka"]
path = UnitTestFrameworkPkg/Library/CmockaLib/cmocka
url = https://gitee.com/zl_work/edk_modules_edk2-cmocka.git
[submodule "MdeModulePkg/Universal/RegularExpressionDxe/oniguruma"]
path = MdeModulePkg/Universal/RegularExpressionDxe/oniguruma
url = https://gitee.com/zl_work/edk_modules_oniguruma.git
[submodule "MdeModulePkg/Library/BrotliCustomDecompressLib/brotli"]
path = MdeModulePkg/Library/BrotliCustomDecompressLib/brotli
url = https://gitee.com/zl_work/edk_modules_brotli.git
[submodule "BaseTools/Source/C/BrotliCompress/brotli"]
path = BaseTools/Source/C/BrotliCompress/brotli
url = https://gitee.com/zl_work/edk_modules_brotli.git
ignore = untracked
[submodule "RedfishPkg/Library/JsonLib/jansson"]
path = RedfishPkg/Library/JsonLib/jansson
url = https://gitee.com/zl_work/edk_modules_jansson.git
1.2.3 下载对应子模块
修改.gitmodules 完毕之后,在edk2目录里面执行 git submodule update --init ,
1.2.4 设置环境变量
一般设置环境变量有两种方法:
- 右键计算机->高级系统设置->环境变量
- 在bat文件里面set
这里我选择使用第二种,在edk2/edksetup.bat增加
set NASM_PREFIX=C:\Program Files\NASM\
set IASL_PREFIX=C:\Program Files\ASL\
set WORKSPACE=C:\bios_code\edk2\
set PACKAGES_PATH=C:\bios_code\edk2\
set PYTHON_HOME=C:\Program Files\Python\Python38\
set CLANG_BIN=C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\Llvm\8.0.0\bin\
1.2.5 设置编译项
执行edksetup.bat之后,编辑edk2/Conf\target.txt
TARGET = RELEASE
TARGET_ARCH = X64
TOOL_CHAIN_TAG = VS2019
ACTIVE_PLATFORM = EmulatorPkg/EmulatorPkg.dsc
1.2.6编译BaseTool
执行 edksetup.bat rebuild编译工具链
1.2.7 编译EmulatorPkg
执行edksetup.bat,然后使用build,成功如下:
1.3运行emulatorPkg模拟器
1.3.1 使用命令行调试
在Buid完之后,在edk2\Build\EmulatorX64\RELEASE_VS2019\X64会生成winhost.exe,可以直接在edk根目录运行
cd Build\EmulatorX64\RELEASE_VS2019\X64 && winhost.exe
注:build的时候最好系统输入法最好切换到英文模式,否则可能会出现模拟器失去焦点问题
1.3.2 使用VS2019调试
因为我这里使用的是vs2019,所以要重新更改解决方案的内容
- 编辑EmulatorPkg\Win\VS2017\BuildVS.bat
cd ../../../
@call edksetup.bat
build -p EmulatorPkg\EmulatorPkg.dsc -t VS2019 %*
- 使用vs2019打开EmulatorPkg\Win\VS2017\Win.sln解决方案,右键属性按照自己对应路径更改输出目录和工作目录
- 点击本地调试器,就可以开始调试了
1.3 使用qemu虚拟机调试OvmfPkg
修改 edksetup.bat设置qemu默认运行path
set PATH=%PATH%;C:\Program Files\qemu
- 执行 build -D ADD_SHELL_STRING 指令编辑模拟器
- 执行 build -p OvmfPkg/OvmfPkgX64.dsc 编译 OvmfPkg
- 执行build -p OvmfPkg/OvmfPkgX64.dsc -D DEBUG_ON_SERIAL_PORT即可看到BIOS CODE的DEBUG信息
- 编译完成,Build\OvmfX64\RELEASE_VS2019\FV/Ovmf.fd,就是可以在虚拟机下面运行的bios
- 使用qemu运行OvmfPkg的bios
qemu-system-x86_64.exe -bios "C:\bios_code\edk2\Build\OvmfX64\RELEASE_VS2019\FV\OVMF.fd" -serial stdio -net none
二、linux下编译环境搭建
操作系统:ubuntu20.04.2
2.1 软件环境
2.1.1安装git
sudo apt install git
2.1.2 安装python3
sudo apt install python3 python3-distutils python3-pip
2.1.3 安装编译相关
- 安装UUID-DEV, 包含编译时所需要的源文件
- 安装NASM, 用来编译X86汇编代码
- 安装BIOSON和FLEX, 编译ACPICA工具需要
sudo apt install uuid-dev nasm bison flex
2.1.4 安装GCC 和 MAKE等编译工具
sudo apt install build-essential
因为我们使用的是 ubuntu20.04 所以安装gcc 版本为9,但是UEFI代码支持 GCC4.8 、GCC4.9 、GCC5进行编译,所以需要安装其中一个版本。
安装gcc5
这里直接安装,在默认安装源找不到安装包候选
两种方法进行安装:
- 需要直接下载安装包安装
安装包地址 - 或者添加软件源,使用apt安装
打开sources.list
sudo vim /etc/apt/sources.list
添加源
deb http://dk.archive.ubuntu.com/ubuntu/ xenial main
deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe
更新
sudo apt update
使用apt下载
sudo apt install gcc-5 g++-5
为gcc-5配置替代版本,并将优先级与之关联
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 80 --slave /usr/bin/g++ g++ /usr/bin/g++-5 --slave /usr/bin/gcov gcov /usr/bin/gcov-5
使用update-alternatives命令更改gcc-5为默认版本
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 40
sudo update-alternatives --config gcc
2.2 编译运行EmulatorPkg
2.2.1 从github下载edk2、edk2-libc、acpica
- edk2 : 开发UEFI应用、驱动和固件所需的主要开发包
- edk2-libc : 提供Stdlib库,允许开发者使用C标准库开发UEFI程序
- acpica : 编译ACPI工具的开发包
git clone https://github.com/tianocore/edk2.git
git clone https://github.com/tianocore/edk2-libc.git
git clone https://github.com/acpica/acpica.git
2.2.2 修改.gitmodules 文件
下载的edk2里面会有一个.gitmodules 文件,国内同步不了.gitmodules里面子模块的内容,我把里面的子模块都同步到了我的gitee仓库里面,所以直接修改成gitee上面对应的链接就行。
[submodule "CryptoPkg/Library/OpensslLib/openssl"]
path = CryptoPkg/Library/OpensslLib/openssl
url = https://gitee.com/zl_work/edk_moudels_openssl.git
[submodule "SoftFloat"]
path = ArmPkg/Library/ArmSoftFloatLib/berkeley-softfloat-3
url = https://gitee.com/zl_work/edk_modules_berkeley-softfloat-3.git
[submodule "UnitTestFrameworkPkg/Library/CmockaLib/cmocka"]
path = UnitTestFrameworkPkg/Library/CmockaLib/cmocka
url = https://gitee.com/zl_work/edk_modules_edk2-cmocka.git
[submodule "MdeModulePkg/Universal/RegularExpressionDxe/oniguruma"]
path = MdeModulePkg/Universal/RegularExpressionDxe/oniguruma
url = https://gitee.com/zl_work/edk_modules_oniguruma.git
[submodule "MdeModulePkg/Library/BrotliCustomDecompressLib/brotli"]
path = MdeModulePkg/Library/BrotliCustomDecompressLib/brotli
url = https://gitee.com/zl_work/edk_modules_brotli.git
[submodule "BaseTools/Source/C/BrotliCompress/brotli"]
path = BaseTools/Source/C/BrotliCompress/brotli
url = https://gitee.com/zl_work/edk_modules_brotli.git
ignore = untracked
[submodule "RedfishPkg/Library/JsonLib/jansson"]
path = RedfishPkg/Library/JsonLib/jansson
url = https://gitee.com/zl_work/edk_modules_jansson.git
2.2.3 下载对应子模块
修改.gitmodules 完毕之后,在edk2目录里面执行 git submodule update --init
git submodule update --init
2.2.4 编译ACPICA
make -C ./acpica/
2.2.5 编译Basetools
进入edk2目录,执行
make -C BaseTools
第一次编译有出现 g++ 之类的问题,执行
sudo apt-get install g++
再重新执行make -C Basetools/
2.2.6 设置开发工具路径
把如下内容加入到 edk2/edksetup.sh里面
export PYTHON_COMMAND=/usr/bin/python3
export IASL_PREFIX=/home/zl/bios_space/acpica/generate/unix/bin/
2.2.7 编译uefi运行程序
执行设置环境变量脚本,在bios_space目录
./edk_export.sh
source edk2/edksetup.sh
编译MdeModulePkg/Application/HelloWorld
build -p MdeModulePkg/MdeModulePkg.dsc -m MdeModulePkg/Application/HelloWorld/HelloWorld.inf -a IA32 -t GCC5
2.2.8 编译运行EmulatorPkg
在EmulatorPkg目录,执行
./build.sh
./build.sh run
出现
gcc 没有安装完全
sudo apt-get install gcc-multilib
安装完成,重新执行
./build.sh
./build.sh run
2.3 使用qemu虚拟机调试OvmfPkg
2.3.1 安装qemu
sudo apt-get install qemu
sudo apt install qemu-system-x86
2.3.2 先build OvmfPkg ,进入目录执行
./build.sh
2.3.3 run qemu虚拟机
qemu-system-x86_64 -bios "/home/zl/bios_space/edk2/Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd" -net none -hda fat:rw:/home/zl/bios_space/edk2/OvmfPkg/qemu_tmp
- /home/zl/bios_space/edk2/Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd -------> 编译ovmf的fd路径
- /home/zl/bios_space/edk2/OvmfPkg/qemu_tmp -------> 是在ovmfpkg里面建的文件夹,挂载到qemu虚拟机,uefi shell下的FS0