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