我正在进行Linux内核开发的第一步。
我有一些代码生成.ko
内核模块,我用insmod
安装。我想要一种方法来调试安装模块时会发生什么,但我遇到了一些困难。
我需要调试init_module
的调用。我运行insmode
时会调用此函数吗?
我尝试使用insmod "/my/url/fil.ko" -m
来调试发生了什么,但每次在-1 Unknown symbol in module
中出现错误/cat/log/message
时,我都会看到错误unknown parameter -m
您知道是否有办法使用GDB进行调试?
答案 0 :(得分:4)
是的,一旦使用insmod将init_module函数加载到内核,就会调用它。您只需添加一行printk,并在插入模块后立即验证它是否正在打印。
您无法传递-m等参数来调试内核模块。
您只能使用MODULE_PARAMS传递要在您编写的内核模块中处理的参数。
答案 1 :(得分:1)
QEMU + GDB步骤调试module_init
首先获取内核模块QEMU + GDB调试一般工作,然后再尝试module_init
:How to debug Linux kernel modules with QEMU?
module_init
更难,因为我们不知道内核模块在加载之前会在哪里加载。
然后,这里有两种非理想但可用的技术可以分解为module_init
:
找到模块加载地址,稍后再重复使用。
模块加载位置在每次启动后都是确定的,因此我们可以找到:
.text
部分的基地址:How to get the address of a kernel module that was inserted using insmod?
module_init
部分内.text
符号的位置:
./readelf -s fops.ko | grep myinit
然后,将它们加起来,告诉GDB在那时断开。
进入module_init
来电。
在内核4.16上,先打破:
do_init_module
然后步骤直到:
ret = fn();
然后进入那个,你进入module_init
函数。
此QEMU + Buildroot setup可用于方便地测试这两种方法。