RISC-V篇-qemu+gdb调试OpenSBI源码 - 哔哩哔哩
2025-03-12 本站作者 【 字体:大 中 小 】
在现代计算机系统中,操作系统的启动和运行是一系列复杂而精细的过程。随着RISC-V架构的兴起,OpenSBI(Open Source Supervisor Binary Interface)作为RISC-V架构下的开源启动固件,扮演着至关重要的角色。它负责初始化硬件、设置虚拟内存、以及将控制权交给操作系统内核。为了深入理解OpenSBI的工作机制,以及优化其性能和稳定性,调试成为了不可或缺的一环。
本文旨在为读者提供一个关于如何使用QEMU模拟器和GDB调试器来调试OpenSBI源码的详细指南。QEMU是一个通用的开源模拟器和虚拟化器,它可以模拟多种处理器架构,而GDB是一个功能强大的调试工具,两者结合使用,可以极大地提高我们对OpenSBI源码调试的效率。
需要说明的是,接下来的操作,我们仍然是基于上次搭建的运行环境进行的,如果你还没有运行环境最好先移步上一篇文章进行搭建:
01以DEBUG方式编译OpenSBI
由于上次编译命令没有加DEBUG=1参数,所以为了调试,需要重新编译:
make clean
make CROSS_COMPILE=riscv64-linux-gnu- PLATFORM=generic DEBUG=1 all -j2
02安装gdb
直接安装gdb-multiarch即可:
sudo apt install gdb-multiarch -y
03修改qemu启动命令
qemu的启动命令有两个修改点需要注意:
run.sh脚本修改成如下内容:
qemu-9.1.1/build/qemu-system-riscv64 -M virt -m 4G \
-bios opensbi/build/platform/generic/firmware/fw_jump.bin \
-kernel linux-6.11.4/arch/riscv/boot/Image \
-initrd buildroot-2024.08.1/output/images/rootfs.cpio \
-append "root=/dev/ram" \
-display none -serial stdio \
-device virtio-scsi-device \
-device virtio-net-pci,netdev=net0 \
-netdev user,id=net0 \
$1 $2
可以看到删除了-smp 4参数,最后面加了两个需要命令行输入的参数,这样做的好处是,当直接运行run.sh而不加任何参数时不影响qemu的运行,而加了-S -s参数时,qemu启动后会等待gdb的连接
04qemu+gdb调试OpenSBI
终端运行如下命令启动qemu:
./run.sh-S -s
此时qemu停下来了,等待gdb的连接
再打开一个终端,进入到fw_jump.elf的目录下:
cd risc-v/opensbi/build/platform/generic/firmware/
运行gdb:
gdb-multiarch
注意,此时不要带fw_jump.elf,因为OpenSBI不在0地址运行,如果带fw_jump.elf参数,gdb会默认加载symbol到0地址,后面还需要删除这些symbol,否则会对调试有影响,比如设置断点会命中多个地址等
qemu的address map如下:
static const MemMapEntry virt_memmap[] = {
[VIRT_DEBUG] ={0x0,0x100 },
[VIRT_MROM] ={0x1000,0xf000 },
[VIRT_TEST] ={0x100000,0x1000 },
[VIRT_RTC] ={0x101000,0x1000 },
[VIRT_CLINT] ={0x2000000,0x10000 },
[VIRT_ACLINT_SSWI] ={0x2F00000,0x4000 },
[VIRT_PCIE_PIO] ={0x3000000,0x10000 },
[VIRT_PLATFORM_BUS] = {0x4000000,0x2000000 },
[VIRT_PLIC] ={0xc000000, VIRT_PLIC_SIZE(VIRT_CPUS_MAX * 2) },
[VIRT_APLIC_M] ={0xc000000, APLIC_SIZE(VIRT_CPUS_MAX) },
[VIRT_APLIC_S] ={0xd000000, APLIC_SIZE(VIRT_CPUS_MAX) },
[VIRT_UART0] ={ 0x10000000,0x100 },
[VIRT_VIRTIO] ={ 0x10001000,0x1000 },
[VIRT_FW_CFG] ={ 0x10100000,0x18 },
[VIRT_FLASH] ={ 0x20000000,0x4000000 },
[VIRT_IMSIC_M] ={ 0x24000000, VIRT_IMSIC_MAX_SIZE },
[VIRT_IMSIC_S] ={ 0x28000000, VIRT_IMSIC_MAX_SIZE },
[VIRT_PCIE_ECAM] ={ 0x30000000,0x10000000 },
[VIRT_PCIE_MMIO] ={ 0x40000000,0x40000000 },
[VIRT_DRAM] ={ 0x80000000,0x0 },
};
OpenSBI是运行在DRAM上的,所以我们需要加载符号表到0x80000000地址
启动gdb后,在gdb命令行执行:
add-symbol-file fw_jump.elf 0x80000000
然后输入y,如下图:
在执行如下命令连接qemu中的gdb server:
target remote:1234
如下图:
之后就可以设置断点进行调试了,如下图:
gdb命令都可以使用,是不是又可以把gdb命令给捡起来了
延伸扩展
常用gdb命令总结:
到这里,你就可以对OpenSBI源码进行debug了,如果你觉得对你有用,请不要吝啬你的一键三连哦!
后面有时间我还会写文章分析OpenSBI源码的实现。

猜你喜欢

吉普指南者是纯进口吗


坝上草原自驾游攻略


lol卡牌


四核也够用?老机体验使命召唤:现代战争2


48小时玩转日照!这份亲测攻略带你解锁小众玩法,海鲜吃到撑!


愚蠢的人类啊,“游戏作弊”的乐趣你们根本不懂!


肯尼亚旅游签证办理流程和注意事项


天目湖山水园一日游攻略 游玩攻略及游玩路线


山西垣曲历山舜王坪:云中草原送清凉 千亩花海迎客来


高考志愿填报详细步骤


“乘双层巴士,游森林城市”南通4辆双层观光巴士今日首发


“体育+旅游”魅力无穷 邛崃市获评“中国体育旅游精品目的地”


旅游地理学课件 黑瞎子岛(抚远三角洲)旅游发展总体规划(承财)教学幻灯片.ppt


东极边贸城跨国第一岛黑瞎子岛及抚远旅游发展规划


台湾屏东垦丁国家公园


中国将增设19个口岸进境免税店 盘点全球十大机场免税店


拓展“旅游+演艺”模式 山东德州市着力打造文旅融合生动样板


韩国购物扮美新旅程.PDF


2024年春节济南市中区乡村文化旅游节活动时间


打洛镇是西双版纳与缅甸接壤的边陲小镇
