如何使用QEMU调试Linux内核模块?

时间:2015-02-19 13:23:04

标签: linux linux-kernel kernel-module qemu

我正在开展修改一些Kernel Networking代码的学术项目,并包含一个新的Kernel module

我正在使用QEMU来加载修改后的内核并进行测试。

但是,我发现在某些.img中需要一个完整的操作系统来进行调试 没有它可能吗?

或者,这是可以与Kernel 2.6 for system一起使用的发行版。除了运行程序的能力,包括网络支持外,发行版不需要任何功能。

2 个答案:

答案 0 :(得分:4)

我认为最简单的方法是使用buildroot http://buildroot.uclibc.org/

克隆它,将其配置为使用您的自定义内核(默认用户空间适合一开始,您可能希望稍后更改它。)

它将构建您的内核和根文件系统。整个过程大约需要半个小时,其中二十分钟正在编译怪物

我的运行线看起来像: QEMU系统-I386     -hda rootfs.ext2     -kernel bzImage     -m 512M      - 支持“root = / dev / sda console = ttyS0”     -当地时间     -serial stdio

以及关于点击设备的更多选项

答案 1 :(得分:2)

最小的全自动QEMU + GDB + Buildroot示例

非模块Linux内核上的QEMU + GDB详见:How to debug the Linux kernel with GDB and QEMU?,并在QEMU内构建内核模块:How to add Linux driver as a Buildroot package让那些工作先行。

接下来,我还在https://github.com/cirosantilli/linux-kernel-module-cheat/tree/1c29163c3919d4168d5d34852d804fd3eeb3ba67#kernel-module-debugging

进行了全自动GDB模块调试

这是您必须采取的主要步骤:

  1. 使用调试符号编译内核模块:

    ccflags-y += -g -DDEBUG
    

    如上所述:kernel module no debugging symbols found

  2. 使用Ctrl + C停止GDB并运行:

    lx-symbols path/to/parent/of/modules/
    

    这个神奇的命令在Linux内核源代码树内的GDB Python脚本中定义,每当GDB停止时,它会递归地为递送模块下存在的已加载模块加载符号。

    使该命令可用的最佳方法是使用:

    gdb -ex add-auto-load-safe-path /full/path/to/linux/kernel
    

    如下所述:GDB: lx-symbols undefined command

  3. insmod内核模块。

    这必须在设置断点之前完成,因为我们不知道内核会事先将模块插入内存中。

    lx-symbols会自动为我们找到模块位置(在主机文件系统和访客内存中!)。

  4. 使用Ctrl + C再次打破GDB,设置断点并享受。

  5. 如果感觉硬核,你也可以完全放弃lx-symbols,并在insmod之后找到模块位置:

    cat /proc/modules
    

    然后手动添加.ko

    add-symbol-file path/to/mymodule.ko 0xfffffffa00000000