? ?
电脑维修网
当前位置:电脑维修网 >操作系统 > 其他系统 >Qemu下调试内核

Qemu下调试内核

2013-12-12 16:31 | 作者:服务器设置 | 来源:其它 | 参与评论 | 点击:1182次

 搭建调试环境

1.选择合适的模拟目标。 Qemu可以模拟很多的目标,比如,想了解arm中断的实现, 那就可以选择versatileab模拟目标。如果想跟踪arm系统中网卡驱动的实现,那选 择smdkc210就可以模拟lan9118网卡芯片了。官方没有文档说明哪个平台支持哪 些外围设备,如果要调试某个特定的设备,只能查看Qemu源代码来选择模拟目标了。 以下是我调试内核多核中断的脚本片断:

  1. kernel="./mach/vexpress/zImage" 
  2. cmdline="root=/dev/ram0 rw console=ttyAMA0 rdinit=/linuxrc loglevel=10" 
  3. initrd="./mach/vexpress/initrd" 
  4. qemu-system-arm -nographic -net nic -net user,tftp="$(pwd)/tftp" -m 256M -smp 4 -M vexpress-a9 -kernel $kernel -append "$cmdline" -initrd $initrd $@ -s -S 

2.调试器。 选择一个合适的调试器,如arm-linux-gdb,我一般用emacs或cgdb做 前端来调试。启动脚本如下:

  1. file vmlinux 
  2. target remote tcp:localhost:1234 
  3. b start_kernel 

这时,内核将停在断点处start_kernel,等待gdb命令。如果想调试平台相关的 内核启动代码,特别是在_mmap_switchedmmu映射之前的代码,还需要手动修改符 号表的偏移。

编译内核

要实现源代码级的调试,产生尽可能多的调试信息,还要修改内核的默认配置。

  1. # .config 添加 
  2. CONFIG_FRAME_POINTER=y 
  3. CONFIG_DEBUG_KERNEL=y 
  4. # 修改 Makefile 中内核的编译选项,减少代码的优化 
  5. KBUILD_CFLAGS += -fno-schedule-insns -fno-schedule-insns2 
  6. KBUILD_CFLAGS += -O1 

上面的修改减少了在单步调试时代码乱跳的情况。内核使用-O0的优化级别编译通不过, 这可能也是其它编译器无法编译内核的一个原因吧。

这样,就可以像调试应用程序一样,在Gdb下调试内核的启动、文件系统、设备模型、 网络子系统等等。另外,由于Qemu还可以模拟很多平台,包括外围设备,脱离物理机 就可以深入内核的移植、设备工作原理等。

转载时请注明:转载自《电脑维修技术网》原文地址:http://www.wikiblast.net/6/7/26227.html
凡文章内未标注来源均为原创文章!恭候您的意见
------分隔线----------------------------
?
最新评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
友情连接版权声明广告合作联系我们意见投诉网站地图百度地图谷歌地图
敬告:本站所有信息都为网友发布,及网络收集而来,我们只对信息的合法性进行审核 请朋友们自行鉴别真实性。
老北京赛车-老北京赛车官网