免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2770 | 回复: 1

[内核入门] qemu+gdb调试内核bootloader [复制链接]

论坛徽章:
11
摩羯座
日期:2013-09-29 17:39:09白羊座
日期:2014-11-13 09:38:14技术图书徽章
日期:2014-01-17 15:07:36狮子座
日期:2013-12-25 14:01:52技术图书徽章
日期:2013-12-17 11:33:22技术图书徽章
日期:2013-12-03 10:27:57天秤座
日期:2013-11-08 15:47:19申猴
日期:2013-10-29 13:16:32未羊
日期:2013-10-12 22:28:56辰龙
日期:2013-10-09 14:39:5515-16赛季CBA联赛之山东
日期:2016-07-25 10:23:00
发表于 2015-07-01 16:06 |显示全部楼层
请教各位大神

我想在源码级别调试内核启动时的情况,包括系统分段与分页的初始化,函数的执行情况等,因此采用在Linux上部署qemu+gdb+busybox/buildroot的方式进行调试

内核的编译已加入调试信息

相应软件都是通过编译方式安装,版本分别为:


内核:Linux 2.6.32.5
  1. # /usr/sbin/bin/gdb --version
  2. GNU gdb (GDB) 7.6.2
复制代码
  1. busybox-1.23.2
复制代码
以静态库的方式进行编译,其他选项未做修改
  1. # grep "STATIC" .config
  2. CONFIG_STATIC=y
复制代码
  1. # qemu --version
  2. QEMU emulator version 2.3.0, Copyright (c) 2003-2008 Fabrice Bellard
复制代码
busybox initramfs的配置方式为:
  1. # dd if=/dev/zero of=disk.img bs=1M count=100
  2. # mkfs.ext4 -F disk.img
  3. # mount -o loop disk.img /mnt/disk/
  4. # mkdir -pv /mnt/disk/{bin,dev,sbin,etc,proc,sys,usr/{bin,sbin}}
  5. # cp -av /usr/local/src/busybox-1.23.2/_install/* /mnt/disk/
  6. # cp -av /usr/local/src/busybox-1.23.2/examples/bootfloppy/etc/* /mnt/disk/etc/
复制代码
配置文件仅修改etc/init.d/rcS,其他保持默认
  1. #! /bin/sh

  2. /bin/mount -t proc proc /proc
  3. /bin/mount -t sysfs sysfs /sys
  4. /sbin/mdev -s
复制代码
  1. # umount /mnt/disk
复制代码
启动内核
  1. # # 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调试
  1. # /usr/sbin/bin/gdb -q /usr/local/src/linux-2.6.32.5/vmlinux
  2. Reading symbols from /usr/local/src/linux-2.6.32.5/vmlinux...done.
  3. (gdb) #
  4. (gdb)
  5. (gdb)
  6. (gdb) target remote localhost:1234
  7. Remote debugging using localhost:1234
  8. 0x0000000000000000 in per_cpu__irq_stack_union ()
  9. (gdb) #
  10. (gdb)
  11. (gdb)
  12. (gdb) set architecture i386:x86-64:intel
  13. The target architecture is assumed to be i386:x86-64:intel
  14. (gdb) #
  15. (gdb)
  16. (gdb)
  17. (gdb) break start_kernel
  18. Breakpoint 1 at 0xffffffff8148e7da: file init/main.c, line 518.
  19. (gdb) #
  20. (gdb)
  21. (gdb)
  22. (gdb) c
  23. Continuing.

  24. Breakpoint 1, start_kernel () at init/main.c:518
  25. 518        {
  26. (gdb)
复制代码
在start_kernel处设置断点时可以在执行到该位置停止

但将目标主机架构设置为set architecture i8086调试bootloader实模式代码,通过break或hbreak的方式将断点设置为0x7c00处时,continue命令后会略过改断点,而直接进入tty终端


通过buildroot创建initramfs以及编译内核,也会出现这种情况,即在start_kernel断点处停止,但会忽略0x7c00断点

google了无数文档,始终没有找到解决方式

请教各位,应如何设置才能够对bootloader的实模式代码进行调试呢?烦请高手们指点一下,小弟在此先行谢过了!!!非常感谢!!!!



论坛徽章:
11
摩羯座
日期:2013-09-29 17:39:09白羊座
日期:2014-11-13 09:38:14技术图书徽章
日期:2014-01-17 15:07:36狮子座
日期:2013-12-25 14:01:52技术图书徽章
日期:2013-12-17 11:33:22技术图书徽章
日期:2013-12-03 10:27:57天秤座
日期:2013-11-08 15:47:19申猴
日期:2013-10-29 13:16:32未羊
日期:2013-10-12 22:28:56辰龙
日期:2013-10-09 14:39:5515-16赛季CBA联赛之山东
日期:2016-07-25 10:23:00
发表于 2015-07-02 14:30 |显示全部楼层
回复 1# superwujc

哪位大神指点一下啊,哪怕是给出一些思路也好啊
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP