本文主要是介绍ubuntu + gdb + ovmf + qemu 虚拟机调试UEFI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
调试BIOS 大部分情况都是在真实的板子上面, 就是build 之后, 烧录到rom 里面, 整个流程非常耗时间,下面讲解如何在qemu 上面调试uefi driver.
环境: ubuntu 18.04
1. 编译:1. source edksetup.sh // 这一步,是设置环境变量
2.build -p OvmfPkg/OvmfPkgIa32.dsc -t GCC5 -D SOURCE_DEBUG_ENABLE
2. 执行qemu
qemu-system-i386 -s -pflash OVMF.fd -net none -debugcon file:-debug.log -global isa-debugcon.iobase=0x402 -hda fat:rw:hda-contents/
$ qemu-system-i386 -s -pflash OVMF_CODE.fd -pflash OVMF_VARS.fd -net none -debugcon file:-debug.log -global isa-debugcon.iobase=0x402 -hda fat:rw:hda-contents -global e1000.romfile="E1000Fmp.rom" -device e1000
3. 启动gdb
gdb 基础:
info register: 列出当前寄存器的值
info breakpoint: 列出所有的断点
info files:
从串口输出来的文件读出相应driver load 进内存起始地址:
结合上面图中的信息算出代码段和数据段的位置:
7d2a000+240 = 7d2a240
7d2a000+240+58c0 = 7D2FB00
加载符号表并设置断点:
让GDB 连上 qemu;
在QEMU 里面重启:
这时候,可以看到GDB 停在了刚刚下的断点处:
key 入list ,可以列出最近的10 行:
接下来,就是gdb 常规操作了。
x/10i 显示程序当前位置开始往后的10条汇编指令。 它可以看到call 指令相关内容 ,就是能知道会调用哪个函数,方便你知道load 哪个符号表。
n 显示下一条代码
linux 环境安装:
chmod +x UDK_Debugger_Tool_v1_5_1.bin
Desktop$ ./UDK_Debugger_Tool_v1_5_1.bin
这篇关于ubuntu + gdb + ovmf + qemu 虚拟机调试UEFI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!