最近,我开始使用QEMU(qemu-system-x86_64)和gdb调试Linux内核5.18.10。我知道QEMU的BIOS在QEMU启动时会将内核代码加载到0x10000,而QEMU在Linux内核中执行的第一条指令位于0x10200。所以我在0x10200处设置了断点。当向gdb发送
continue
命令后,它收到“程序收到信号SIGTRAP,跟踪/断点陷阱”的消息。然后EIP被设置为0x0。所以我无法调试Linux启动进度。
我想问一下有人能解决吗?非常感谢。
下面的文字是我在 QEMU 和 gdb 中的操作和输出。
qemu-system-x86_64 -kernel ./arch/x86_64/boot/bzImage \
-device virtio-serial \
-chardev pty,id=virtiocon0 -device virtconsole\
-drive file=core-image-minimal-qemux86.ext4,if=virtio,format=ra\
--append "root=/dev/vda loglevel=15 console=tt\
-nographic \
-m 256 -s -S
gdb /home/wt/gitrepo/linux/vmlinux
和我的.gdbinit
add-auto-load-safe-path /home/wt/gitrepo/linux/scripts/gdb/vmlinux-gdb.py
dir /home/wt/gitrepo/linux
target remote :1234
// output of gdb
(gdb) b *0x10200
Breakpoint 1 at 0x10200
// output of QEMU
SeaBIOS (version 1.15.0-1)
iPXE (https://ipxe.org) 00:03.0 CA00 PCI2.10 PnP PMM+0FF8B2A0+0FECB2A0 CA00
Booting from ROM..
// output of gdb
(gdb) c
Continuing.
Program received signal SIGTRAP, Trace/breakpoint trap.
0x0000000000000000 in fixed_percpu_data ()
(gdb) c
Continuing.
Program received signal SIGTRAP, Trace/breakpoint trap.
0x0000000000000000 in fixed_percpu_data ()
过去几天我一直在为同样的行为而苦苦挣扎。 对于处于相同情况的任何人,原因如下:
gdb 或您的启动过程没有任何问题。发生的情况是,您遇到了断点,EIP 将变为 0x0,但您的 CS 也在发生变化。特别是去0x1020。 所以下一条指令实际上是在:
0x1020 * 16 + 0x0 = 0x10200
这正是您想要的。您可以按以下顺序查看:
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x000000000000fff0 in exception_stacks ()
(gdb) info reg $pc
pc 0xfff0 0xfff0 <exception_stacks+16368>
(gdb) info reg $cs
cs 0xf000 61440
(gdb) b *0x10200
Breakpoint 1 at 0x10200
(gdb) continue
Continuing.
Program received signal SIGTRAP, Trace/breakpoint trap.
0x0000000000000000 in fixed_percpu_data ()
(gdb) info reg $pc
pc 0x0 0x0 <fixed_percpu_data>
(gdb) info reg $cs
cs 0x1020 4128
从那里您可以以实模式进入内核启动。
问候!