公司动态
Qemu下调试内核
摘要: 文章目录索引(?) [-]搭建调试环境编译内核搭建调试环境1 选择合适的模拟目标。 Qemu可以模拟很多的目标,比如,想了解arm中断的实现, 那就可以选择versatileab模拟目标。如果想跟踪...
发布日期:2018-04-25文章目录索引(?) [-]
- 搭建调试环境编译内核
搭建调试环境
1.选择合适的模拟目标。 Qemu可以模拟很多的目标,比如,想了解arm中断的实现, 那就可以选择versatileab模拟目标。如果想跟踪arm系统中网卡驱动的实现,那选 择smdkc210就可以模拟lan9118网卡芯片了。官方没有文档说明哪个平台支持哪 些外围设备,如果要调试某个特定的设备,只能查看Qemu源代码来选择模拟目标了。 以下是我调试内核多核中断的脚本片断:
- kernel="./mach/vexpress/zImage"cmdline="root=/dev/ram0rwconsole=ttyAMA0rdinit=/linuxrcloglevel=10"
- 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做 前端来调试。启动脚本如下:
- filevmlinuxtargetremotetcp:localhost:1234
- bstart_kernelc
这时,内核将停在断点处start_kernel,等待gdb命令。如果想调试平台相关的 内核启动代码,特别是在_mmap_switchedmmu映射之前的代码,还需要手动修改符 号表的偏移。
编译内核
要实现源代码级的调试,产生尽可能多的调试信息,还要修改内核的默认配置。
- #.config添加CONFIG_FRAME_POINTER=y
- CONFIG_DEBUG_KERNEL=y#修改Makefile中内核的编译选项,减少代码的优化
- KBUILD_CFLAGS+=-fno-schedule-insns-fno-schedule-insns2KBUILD_CFLAGS+=-O1
上面的修改减少了在单步调试时代码乱跳的情况。内核使用-O0的优化级别编译通不过, 这可能也是其它编译器无法编译内核的一个原因吧。
这样,就可以像调试应用程序一样,在Gdb下调试内核的启动、文件系统、设备模型、 网络子系统等等。另外,由于Qemu还可以模拟很多平台,包括外围设备,脱离物理机 就可以深入内核的移植、设备工作原理等。