一、windows下编译环境搭建

1.1 软件环境

  1. 操作系统:windows10
  2. 编译器:VS2019
  3. Python38 :python-3.8.0-amd64.exe
  4. ASL :iasl-win-20210730.zip
  5. NASM :nasm-2.13.03-installer-x64.exe
  6. git
  7. 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 设置环境变量

一般设置环境变量有两种方法:

  1. 右键计算机->高级系统设置->环境变量
  2. 在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,成功如下:

windows 下qemu 连外网_edk

1.3运行emulatorPkg模拟器

1.3.1 使用命令行调试

在Buid完之后,在edk2\Build\EmulatorX64\RELEASE_VS2019\X64会生成winhost.exe,可以直接在edk根目录运行

cd Build\EmulatorX64\RELEASE_VS2019\X64 && winhost.exe

windows 下qemu 连外网_edk_02


注:build的时候最好系统输入法最好切换到英文模式,否则可能会出现模拟器失去焦点问题

1.3.2 使用VS2019调试

因为我这里使用的是vs2019,所以要重新更改解决方案的内容

  1. 编辑EmulatorPkg\Win\VS2017\BuildVS.bat
cd ../../../
@call edksetup.bat
build -p EmulatorPkg\EmulatorPkg.dsc -t VS2019 %*
  1. 使用vs2019打开EmulatorPkg\Win\VS2017\Win.sln解决方案,右键属性按照自己对应路径更改输出目录工作目录
  2. 点击本地调试器,就可以开始调试了

1.3 使用qemu虚拟机调试OvmfPkg

修改 edksetup.bat设置qemu默认运行path

set PATH=%PATH%;C:\Program Files\qemu
  1. 执行 build -D ADD_SHELL_STRING 指令编辑模拟器
  2. 执行 build -p OvmfPkg/OvmfPkgX64.dsc 编译 OvmfPkg
  3. 执行build -p OvmfPkg/OvmfPkgX64.dsc -D DEBUG_ON_SERIAL_PORT即可看到BIOS CODE的DEBUG信息
  4. 编译完成,Build\OvmfX64\RELEASE_VS2019\FV/Ovmf.fd,就是可以在虚拟机下面运行的bios
  5. 使用qemu运行OvmfPkg的bios
qemu-system-x86_64.exe -bios "C:\bios_code\edk2\Build\OvmfX64\RELEASE_VS2019\FV\OVMF.fd" -serial stdio -net none

windows 下qemu 连外网_uefi_03

二、linux下编译环境搭建

操作系统:ubuntu20.04.2

2.1 软件环境

2.1.1安装git

sudo apt install git

windows 下qemu 连外网_git_04

2.1.2 安装python3

sudo apt install python3 python3-distutils python3-pip

windows 下qemu 连外网_ios_05

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

windows 下qemu 连外网_windows 下qemu 连外网_06

因为我们使用的是 ubuntu20.04 所以安装gcc 版本为9,但是UEFI代码支持 GCC4.8 、GCC4.9 、GCC5进行编译,所以需要安装其中一个版本。

安装gcc5

这里直接安装,在默认安装源找不到安装包候选

windows 下qemu 连外网_git_07


两种方法进行安装:

  1. 需要直接下载安装包安装
    安装包地址
  2. 或者添加软件源,使用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

windows 下qemu 连外网_windows 下qemu 连外网_08

2.2 编译运行EmulatorPkg

2.2.1 从github下载edk2、edk2-libc、acpica

  1. edk2 : 开发UEFI应用、驱动和固件所需的主要开发包
  2. edk2-libc : 提供Stdlib库,允许开发者使用C标准库开发UEFI程序
  3. 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/

windows 下qemu 连外网_windows 下qemu 连外网_09

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

出现

windows 下qemu 连外网_edk_10

gcc 没有安装完全

sudo apt-get install gcc-multilib

安装完成,重新执行

./build.sh
./build.sh run

windows 下qemu 连外网_uefi_11

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

windows 下qemu 连外网_windows 下qemu 连外网_12