- 论坛徽章:
- 11
|
请教各位大神
我想在源码级别调试内核启动时的情况,包括系统分段与分页的初始化,函数的执行情况等,因此采用在Linux上部署qemu+gdb+busybox/buildroot的方式进行调试
内核的编译已加入调试信息
相应软件都是通过编译方式安装,版本分别为:
内核:Linux 2.6.32.5- # /usr/sbin/bin/gdb --version
- GNU gdb (GDB) 7.6.2
复制代码 以静态库的方式进行编译,其他选项未做修改- # grep "STATIC" .config
- CONFIG_STATIC=y
复制代码- # qemu --version
- QEMU emulator version 2.3.0, Copyright (c) 2003-2008 Fabrice Bellard
复制代码 busybox 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
复制代码 启动内核- # # 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的实模式代码进行调试呢?烦请高手们指点一下,小弟在此先行谢过了!!!非常感谢!!!!
|
|