欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

UEFI源码解析之调试环境搭建

时间:2023-08-26

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缓存

 

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。