Linux insmod lkm.ko在可加载内核模块中调用cleanup_模块,而不是init_模块

Linux insmod lkm.ko在可加载内核模块中调用cleanup_模块,而不是init_模块,linux,kernel,insmod,Linux,Kernel,Insmod,我正试图在debian wheezy 7.5上实现我的第一个可加载内核模块。我在网上试用了不同教程中的一些示例代码,但它对我来说并不像我想的那样有效 这是我的密码: #include <linux/module.h> #include <linux/kernel.h> void cleanup_module(void) { printk(KERN_INFO "exit LKM..."); } int init_module(void) { printk

我正试图在debian wheezy 7.5上实现我的第一个可加载内核模块。我在网上试用了不同教程中的一些示例代码,但它对我来说并不像我想的那样有效

这是我的密码:

#include <linux/module.h>
#include <linux/kernel.h>

void cleanup_module(void)
{
    printk(KERN_INFO "exit LKM...");
}

int init_module(void)
{
    printk(KERN_INFO "loading LKM...");
    return 0;
}
所以它编译得很好,但当我加载LKM时,加载了“$sudo insmod LKM.ko”,然后查看日志消息,它会返回“exit LKM…”,所以insmod似乎调用了cleanup_模块系统调用,而不是init_模块。同样的情况也会发生,当我使用“$sudo rmmod lkm”时,我会在日志消息中返回“loading lkm..”。所以我真的不知道这是为什么,我在网上发现的是,insmod通过init_module()加载LKM,等等

我希望能得到一些帮助或解释,因为我真的不知道哪里出了问题


谢谢

将换行符aka
\n
放在printk字符串的末尾

您看到的问题是由于打印延迟造成的。我敢打赌,第一次运行insmod时,您根本没有看到任何输出。然后你做了一些其他的事情,然后卸载了模块。此时,缓冲区清除了上一条消息,使其看起来好像在卸载期间打印了init消息


实际发生的是内核正在保存行,以便在看到换行符时输出完整的行。该换行符直到稍后才到达。

再试一次,但将换行符放在printk字符串的末尾。解决了它!谢谢!我猜那是新手犯的错误@ZanLynx你能解释一下我为什么要放它们吗?
obj-m += lkm.o
all:
    sudo make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules