Qemu下调试内核 - 电脑 - 【南平电脑网】_南平电脑维修_南平笔记本电脑维修_监控安装_市区上门维修
公司动态

Qemu下调试内核

摘要: 文章目录索引(?) [-]搭建调试环境编译内核搭建调试环境1 选择合适的模拟目标。 Qemu可以模拟很多的目标,比如,想了解arm中断的实现, 那就可以选择versatileab模拟目标。如果想跟踪...

发布日期:2018-04-25

文章目录索引(?) [-]

    搭建调试环境编译内核

搭建调试环境

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

  1. kernel="./mach/vexpress/zImage"cmdline="root=/dev/ram0rwconsole=ttyAMA0rdinit=/linuxrcloglevel=10"
  2. initrd="./mach/vexpress/initrd"qemu-system-arm-nographic-netnic-netuser,tftp="$(pwd)/tftp"-m256M-smp4-Mvexpress-a9-kernel$kernel-append"$cmdline"-initrd$initrd$@-s-S

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

  1. filevmlinuxtargetremotetcp:localhost:1234
  2. bstart_kernelc

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

编译内核

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

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

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

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