我正在开展修改一些Kernel Networking
代码的学术项目,并包含一个新的Kernel module
。
我正在使用QEMU来加载修改后的内核并进行测试。
但是,我发现在某些.img
中需要一个完整的操作系统来进行调试
没有它可能吗?
或者,这是可以与Kernel 2.6 for system一起使用的发行版。除了运行程序的能力,包括网络支持外,发行版不需要任何功能。
答案 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让那些工作先行。
进行了全自动GDB模块调试这是您必须采取的主要步骤:
使用调试符号编译内核模块:
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