1

我正在尝试在 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;
}

我正在用一个看起来像这样的 Makefile 编译它

obj-m += lkm.o
all:
    sudo make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

所以它编译得很好,但是当我用"$ sudo insmod lkm.ko"加载 LKM然后查看日志消息时,它会返回"exit LKM...",所以看起来 insmod 调用了 cleanup_module 系统调用而不是 init_module。同样的事情发生了,当我使用"$ sudo rmmod lkm"时,我在日志消息中得到了"loading LKM.." 。所以我真的不知道为什么会这样,我在网上找到的只是,insmod 通过 init_module() 加载 LKM 等等......

我会很感激一些帮助或解释,因为我真的不知道出了什么问题。

谢谢

4

1 回答 1

1

\n在 printk 字符串的末尾放置换行符。

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

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

于 2014-06-14T02:26:45.823 回答