欢迎光临散文网 会员登陆 & 注册

UEFI开发环境搭建(踩坑指南)

2023-02-28 17:12 作者:_妖精森林的小不点_  | 我要投稿

参考内容

「Coding Tools」 第3话 Ubuntu下EDK2开发环境搭建 - 哔哩哔哩 (bilibili.com)

「Coding Tools」 第4话 如何使用Qemu虚拟机运行EDK2编译结果 - 哔哩哔哩 (bilibili.com)

《UEFI编程实践》- 罗冰 机械工业出版社

环境:

vmware 17

ubuntu 22.04(不建议使用20.04以下的环境)

1、 安装依赖工具

apt install python3 (建议使用python3不要使用python2)

apt install python3-distutils

apt install uuid-dev

apt install nasm(必须2.15及以上

apt install bison

apt install flex

apt install iasl(不要使用acpica! 可能会导致编译OVMF镜像时路径错误

2、 下载开发包

mkdir ~/UEFI

cd ~/UEFI

git clone http://github.com/tianocore/edk2.git

git clone http://github.com/tianocore/edk2-libc.git

3、 配置编译环境

cd edk2

git submodule update –init (此时会遭遇多次失败,不要怀疑自己,重复几次即可,使用科学上网有概率提高成功率)

make -C BaseTools (成功会提示OK)

新建脚本配置环境方便多次使用 vim initedk.sh 内容为:

    cd $home/~/UEFI/edk2

    export EDK_TOOLS_PATH=$home/~/UEFI/edk2/BaseTools

    source edksetup.sh BaseTools

    export PYTHON_COMMAND=/usr/bin/python3(若默认python环境为2可加此条,一般不用)

4、 编译UEFI模拟器

本文只编译64位模拟器,qemu及应用程序,若要编译32位程序使用命令-a IA32,目前遇到的问题是使用64位机器编译32位程序仍然会从64位的基础库中查找依赖,理论解决方法是将32位的依赖库添加一个硬链接(暂未解决)。

source initedk.sh

build -p edk2/EmulatorPkg/EmulatorPkg.dsc -t GCC5 -a X64

或者修改edk2/Conf目录下的target.txt

以done标志成功

编译完成后生成的文件在~ /UEFI/edk2/Build/EmulatorX64/DEBUG_GCC5/X64中

可执行文件./Host

5、 编译OVMF镜像及GDB调试

以MdeModulePkg的HelloWorld为目标调试工具

5.1添加调试代码

编辑HelloWorld源码目录在

~/UEFI/edk2/MdeModulePkg/Application/HelloWorld/HelloWorld.c

添加头文件声明

    #include <Library/DebugLib.h>

主程序中添加获取程序入口地址代码

    DEBUG ((EFI_D_INFO, "HelloWorld:My Entry point is 0x%08x\n", (CHAR16*)UefiMain ));

接着编辑OvmfPkg.dsc,文件路径在

~/UEFI/edk2/OvmfPkg/OvmfPkgX64.dsc

在[Components]下添加代码

    MdeModulePkg/Application/HelloWorld/HelloWorld.inf{

    <LibraryClasses>

    DebugLib|MdePkg/Library/UefiDebugLibConOut/UefiDebugLibConOut.inf

    }

5.2编译OVMF镜像

build -p edk2/OvmfPkg/OvmfPkgX64.dsc -t GCC5 -a X64 -b DEBUG

以done标志成功,编译完成的文件在~/edk2/Build/OvmfX64/DEBUG_GCC5中,镜像文件在此目录下的FV中,HelloWorld二进制文件在此目录下的X64中。

5.3准备qemu环境

 ~/UEFI  mkdir ovmf_dbg

 cd ovmf_dbg

 cp edk2/Build/OvmfX64/DEBUG_GCC5/FV/OVMF.fd ./

 cp mkdir hda_contents

 cp edk2/Build/OvmfX64/DEBUG_GCC5/X64/HelloWorld.* ./had_contents

5.4启动qemu

       qemu-system-x84_64 -s -pflash OVMF.fd -hda fat:rw:hda_contents/ -net none

-debugcon file:debug.log -global isa-debugcon.iobase=0x402

       可能会提示

把他装了就完了,进入Shell,执行HelloWorld.efi,执行过程会同步将调试信息输出到debug.log

 打开日志文件,查找加载驱动的指针地址Loading driver point   

5.5 GDB挂载调试

       计算偏移地址

       text = 0x61D2000+0x0000240 = 0x61D2240

       data = 0x61D2000+0x0000240+0x0002080 = 0x61D42c0

       加载符号,设定断点,并将GDB挂载到QEMU上

回到Shell,再次运行HelloWorld.efi,断点被命中,gdb程序同步运行,可进行后续调试工作。

至此环境搭建确认完成,可以正常使用调试。


UEFI开发环境搭建(踩坑指南)的评论 (共 条)

分享到微博请遵守国家法律