我正在尝试在DebianWheezy7.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-IsMod LKK.Ko”加载LKM,然后查看日志消息时,它给出了“退出LKM…”,所以它看起来像是NSMOD调用了CurruBuffMead系统调用而不是iNITI模块。同样的事情发生了,当我使用“$sudo rmmod lkm”时,我在日志消息中得到“loading lkm…”。所以我真的不知道这是为什么,我在网上找到的就是,insmod通过init_module()等加载lkm……
我很感激你的帮助和解释,因为我真的不知道出了什么问题。
谢谢
最佳答案
将新行aka\n
放在printk字符串的末尾。
您看到的问题是由于打印延迟造成的。我敢打赌,第一次运行insmod时,根本看不到任何输出。然后你做了一些其他的事情,然后你卸载了模块。这时,缓冲区刷新了前一条消息,使它看起来好像在卸载期间打印了init消息。
实际发生的是内核正在保存行,以便在看到换行符时输出完整的行。那条专线后来才到达。
关于linux - insmod lkm.ko在可加载内核模块中调用cleanup_module而不是init_module,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24214885/