qemu+gdb调试内核bootloader
请教各位大神我想在源码级别调试内核启动时的情况,包括系统分段与分页的初始化,函数的执行情况等,因此采用在Linux上部署qemu+gdb+busybox/buildroot的方式进行调试
内核的编译已加入调试信息
相应软件都是通过编译方式安装,版本分别为:
内核:Linux 2.6.32.5# /usr/sbin/bin/gdb --version
GNU gdb (GDB) 7.6.2busybox-1.23.2以静态库的方式进行编译,其他选项未做修改# grep "STATIC" .config
CONFIG_STATIC=y# qemu --version
QEMU emulator version 2.3.0, Copyright (c) 2003-2008 Fabrice Bellardbusybox initramfs的配置方式为:# dd if=/dev/zero of=disk.img bs=1M count=100
# mkfs.ext4 -F disk.img
# mount -o loop disk.img /mnt/disk/
# mkdir -pv /mnt/disk/{bin,dev,sbin,etc,proc,sys,usr/{bin,sbin}}
# cp -av /usr/local/src/busybox-1.23.2/_install/* /mnt/disk/
# cp -av /usr/local/src/busybox-1.23.2/examples/bootfloppy/etc/* /mnt/disk/etc/配置文件仅修改etc/init.d/rcS,其他保持默认#! /bin/sh
/bin/mount -t proc proc /proc
/bin/mount -t sysfs sysfs /sys
/sbin/mdev -s# umount /mnt/disk启动内核# # qemu-system-x86_64 -kernel /usr/local/src/linux-2.6.32.5/arch/x86/boot/bzImage -hda /debug/disk.img -boot c -append "root=/dev/sda rw" -enable-kvm -s -S
在另一终端启动gdb调试# /usr/sbin/bin/gdb -q /usr/local/src/linux-2.6.32.5/vmlinux
Reading symbols from /usr/local/src/linux-2.6.32.5/vmlinux...done.
(gdb) #
(gdb)
(gdb)
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x0000000000000000 in per_cpu__irq_stack_union ()
(gdb) #
(gdb)
(gdb)
(gdb) set architecture i386:x86-64:intel
The target architecture is assumed to be i386:x86-64:intel
(gdb) #
(gdb)
(gdb)
(gdb) break start_kernel
Breakpoint 1 at 0xffffffff8148e7da: file init/main.c, line 518.
(gdb) #
(gdb)
(gdb)
(gdb) c
Continuing.
Breakpoint 1, start_kernel () at init/main.c:518
518 {
(gdb)在start_kernel处设置断点时可以在执行到该位置停止
但将目标主机架构设置为set architecture i8086调试bootloader实模式代码,通过break或hbreak的方式将断点设置为0x7c00处时,continue命令后会略过改断点,而直接进入tty终端
通过buildroot创建initramfs以及编译内核,也会出现这种情况,即在start_kernel断点处停止,但会忽略0x7c00断点
google了无数文档,始终没有找到解决方式
请教各位,应如何设置才能够对bootloader的实模式代码进行调试呢?烦请高手们指点一下,小弟在此先行谢过了!!!非常感谢!!!!
回复 1# superwujc
哪位大神指点一下啊,哪怕是给出一些思路也好啊
页:
[1]