我试图在 qemu 环境中使用 GDB 逐步理解内核启动顺序。
以下是我的设置:
在一个终端中我正在运行
~/Qemu_arm/bin/qemu-system-arm -M vexpress-a9 -dtb ./arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel ./arch/arm/boot/zImage -append "root=/dev/mmcblk0 console=ttyAMA0" -sd ../Images/RootFS.ext3 -serial stdio -s -S
在其他终端
arm-none-linux-gnueabi-gdb vmlinux
Reading symbols from vmlinux...done.
(gdb) target remote :1234
Remote debugging using :1234
0x60000000 in ?? ()
我的问题是如何为 /arch/arm/boot/compressed/* files 中的代码设置断点。
例如,我尝试为 Misc.c 中定义的 decompress_kernel 设置断点。
Case 1:
(gdb) b decompress_kernel
Function "decompress_kernel" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (decompress_kernel) pending.
(gdb) c
Continuing.
上面的一个无法命中qemu正在启动的功能。
Case 2:
(gdb) b *0x80008000
Breakpoint 1 at 0x80008000: file arch/arm/kernel/head.S, line 89.
(gdb) c
Continuing.
在这种情况下,它也无法命中,而是 qemu 正在启动。
Case 3:
(gdb) b start_kernel
Breakpoint 1 at 0x8064d8d8: file init/main.c, line 498.
(gdb) c
Continuing.
Breakpoint 1, start_kernel () at init/main.c:498
498 {
(gdb)
在这种情况下,功能正在运行,我可以逐步调试。
注意:我已经启用了 debug、Early printk 并尝试了 hbreak
所以我的查询是:
- 为什么有些函数无法命中断点?
- 这是 qemu 限制还是我需要启用更多功能?
- 我需要附加任何额外的参数吗?
- 如何调试早期内核启动