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

How to debug Linux kernel modules with QEMU?

我正在从事修改一些 Kernel Networking 代码并包含新的 Kernel module.

的学术项目

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

但是,我发现在某些 .img 中需要完整的 OS 才能进行调试。
没有它可能吗?

或者,哪个是可以与内核 2.6 系统一起使用的发行版。该发行版不需要任何功能,除了 运行 程序的能力,包括网络支持。

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

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

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

我的 运行 行看起来像: qemu-系统-i386 -hda rootfs.ext2 -内核bzImage -m 512M -追加"root=/dev/sda console=ttyS0" -当地时间 -串行标准输入

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

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

QEMU + GDB on non-module Linux kernel 详细介绍在:How to debug the Linux kernel with GDB and QEMU? and building the kernel modules inside QEMU at: How to add Linux driver as a Buildroot package Get those work first.

接下来,我还完全自动化了 GDB 模块调试:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/1c29163c3919d4168d5d34852d804fd3eeb3ba67#kernel-module-debugging

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

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

    ccflags-y += -g -DDEBUG
    

    如在以下位置所述:

  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
    

    如解释于:

  3. insmod内核模块。

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

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

  4. Ctrl + C再次打断GDB,设置断点,尽情享受吧。

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

cat /proc/modules

然后手动添加 .ko

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