如何使用 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
这些是您必须采取的主要步骤:
使用调试符号编译内核模块:
ccflags-y += -g -DDEBUG
如在以下位置所述:
用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
如解释于:
insmod
内核模块。
这必须在设置断点之前完成,因为我们事先不知道内核会将模块插入内存中的哪个位置。
lx-symbols
自动为我们查找模块位置(在主机文件系统和客户机内存中!)。
用Ctrl + C
再次打断GDB,设置断点,尽情享受吧。
如果感觉硬核,您也可以完全放弃 lx-symbols
,并在 insmod
之后找到模块位置:
cat /proc/modules
然后手动添加 .ko
:
add-symbol-file path/to/mymodule.ko 0xfffffffa00000000
我正在从事修改一些 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
这些是您必须采取的主要步骤:
使用调试符号编译内核模块:
ccflags-y += -g -DDEBUG
如在以下位置所述:
用
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
如解释于:
insmod
内核模块。这必须在设置断点之前完成,因为我们事先不知道内核会将模块插入内存中的哪个位置。
lx-symbols
自动为我们查找模块位置(在主机文件系统和客户机内存中!)。用
Ctrl + C
再次打断GDB,设置断点,尽情享受吧。
如果感觉硬核,您也可以完全放弃 lx-symbols
,并在 insmod
之后找到模块位置:
cat /proc/modules
然后手动添加 .ko
:
add-symbol-file path/to/mymodule.ko 0xfffffffa00000000