当前位置: 代码迷 >> 综合 >> ubuntu + gdb + ovmf + qemu 虚拟机调试UEFI
  详细解决方案

ubuntu + gdb + ovmf + qemu 虚拟机调试UEFI

热度:31   发布时间:2023-12-14 22:22:51.0

调试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;

Caption

 

在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