linux - insmod lkm.ko 在可加载内核模块中调用 cleanup_module 而不是 init_module

标签 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(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...

如果能得到一些帮助或解释,我将不胜感激,因为我真的不知道哪里出了问题。

谢谢

最佳答案

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

您看到的问题是由延迟打印引起的。我敢打赌,您第一次运行 insmod 时,根本看不到任何输出。然后你做了一些其他的事情,然后你卸载了模块。那时,缓冲区冲掉了之前的消息,导致它看起来好像在卸载期间打印了初始化消息。

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

关于linux - insmod lkm.ko 在可加载内核模块中调用 cleanup_module 而不是 init_module,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24214885/

相关文章:

c - 错误: implicit declaration of function 'rdtscl' [-Werror=implicit-function-declaration] (but no error when running on older kernel version)

linux 在没有系统日志消息的情况下崩溃

c - 对于另一个模块中定义的符号,insmod 失败并显示 "Unknown symbol in module"

linux - 如何跳过安装两次的目录?

linux - 将多个文件名参数传递给 stat()?

linux - 在 Linux 内核中将 while(1) 循环更改为忙等待

Ubuntu 中的 C++ 手册页

linux - 《Linux 内核模块程序员指南》中 chardev.c 示例的问题

linux - insmod:错误:无法插入模块:套接字协议(protocol)类型错误

c - insmod:错误:无法插入模块 kprobe_example.ko:不允许操作