UEFI-Edk2源码复杂且BIOS运行依赖主板硬件,学习阶段可通过编译edk2源码包中的模拟器调式edk2的代码结构和运行流程。
1、依赖环境的安装:Win10下edk2编译环境搭建
Visual Studio community 2017(注册微软账号,避免VS社区版试用阶段过期)
EDK2-stable-202002
下载地址:https://github.com/tianocore/edk2/releases/tag/edk2-stable202002
下载源码到本地目录如D:edk2edk2-stable-202011
Python:用于执行edk2的编译脚本
需要在安装时勾选Add Python to PATH,这样在用户变量的path里能找到Python的路径。
我电脑的Python路径为C:UsersAdministratorAppDataLocalProgramsPythonPython38
nasm安装到c:/nasm
https://www.nasm.us/
ASL安装到c:/asl
https://acpica.org/downloads/binary-tools
注意:软件安装路径可按自己的需求选择,但是需要添加到系统环境变量里;
OpenSSl
下载Openssl. http://wiki.overbyte.eu/arch/openssl-1.1.0g-win32.zip.
解压到CryptoPkgLibraryOpensslLib中,重命名为openssl
如:CryptoPkgLibraryOpensslLibopenssl
baseTool
GitHub - tianocore/edk2-baseTools-win32: git-svn mirror of https://svn.code.sf.net/p/edk2-toolbinaries/code/trunk/Win32下载并解压到edk2baseToolsBin,重命名为Win32
如:baseToolsBinWin32
BrotliCompress
下载https://github.com/google/brotli,解压到
baseToolsSourceCBrotliCompressbrotli
修改baseToolsSourceCBrotliCompressMakefile中相关内容为:
COMMON_OBJ = brotliccommondictionary.obj brotliccommontransform.obj
DEC_OBJ =
brotlicdecbit_reader.obj
brotlicdecdecode.obj
brotlicdechuffman.obj
brotlicdecstate.obj
ENC_OBJ =
brotli/c/enc/fast_log.obj
brotli/c/common/platform.obj
brotli/c/common/context.obj
brotli/c/enc/command.obj
brotlicencbackward_references.obj
brotli/c/common/constants.obj
brotlicencbackward_references_hq.obj
brotlicencbit_cost.obj
brotlicencblock_splitter.obj
brotlicencbrotli_bit_stream.obj
brotlicenccluster.obj
brotlicenccompress_fragment.obj
brotlicenccompress_fragment_two_pass.obj
brotlicencdictionary_hash.obj
brotlicencencode.obj
brotlicencencoder_dict.obj
brotlicencentropy_encode.obj
brotlicenchistogram.obj
brotlicencliteral_cost.obj
brotlicencmemory.obj
brotlicencmetablock.obj
brotlicencstatic_dict.obj
brotlicencutf8_util.obj
OBJECTS =
BrotliCompress.obj
$(COMMON_OBJ)
$(DEC_OBJ)
$(ENC_OBJ)
否则会由于BrotliCompress版本不正确出现如下报错:
2、配置EDK2编译环境
(1) cmd进入EDK安装目录执行.edksetup.bat rebuild
(2) 配置conftarget.txt,将TOOL_CHAIN_TAG改为VS2017(VS2019可改为VS2019)
(3) 把conftools_def.txt中的DEFINE VS_HOST从x86改为x64
(4) 执行edksetup.bat VS2017
(5) 执行build -a X64
(6) 编译成功,在BuildEmulatorX64DEBUG_VS2017X64文件夹下得到winhost.exe,双击运行就进入了UEFI模拟器。
注意:
1、打开cmd终端执行编译,不要用powershell,会遇到编译脚本找不到问题;
2、需要IASL/NASM等告警可不处理;
3、该编译方式编译的源码为EmulatorPkg
3、调试模拟器
用visual studio打开模拟器工程:EmulatorPkgWinVS2017Win.sln,即可在visual studio软件中编译运行UEFI模拟器工程了,也可以在efi应用/驱动上打上断点,以调试模式调试SEC/PEI/DXE/BDS等。
模拟器入口:
Sec入口:
Pei入口:
DXE入口:
BDS入口:
4、搭建QEMU调试环境
4.1 安装qemu,添加到环境变量;
QEMU for Windows – Installers (64 bit) (weilnetz.de)
4.2 编译Ovmf虚拟机调试用FD文件,且打开串口调试功能;
Build -a X64 -p OvmfPkg/OvmfPkgX64.dsc -t VS2017 -D SOURCE_DEBUG_ENABLE=TRUE -D DEBUG_ON_SERIAL_PORT
拷贝编译好的OVMF.Fd到qemu安装目录,执行:
qemu-system-x86_64 -bios "OVMF.fd" -serial stdio > hello.log ,将执行日志保存在hello.log中;
4.3 给qemu虚拟机添加启动项
在qemu安装目录下穿甲文件夹hddisk,将编译好的efi文件放在该目录下;执行:
qemu-system-x86_64 -bios "OVMF.fd" -hda fat:rw:hddisk -serial stdio
将加载hddisk下的文件执行;
附录:VS2019无法下载问题
现象:一直卡在下图界面知道超时
解决方法:修改wifi的DNS链接地址,同时设置手机热点链接;
在首选DNS服务器输入:114.114.114.114
在备用DNS服务器输入:8.8.8.8
(这里的114.114.144.114是全国通用DNS地址,而8.8.8.8是全球通用DNS地址。)
还是不行:刷新DNS缓存