全部
我正在使用 linux 内核 2.6.35 在 Fedora14 中开发一个模块。操作系统实际上是在虚拟框中运行的。
我观察到的是,在我对代码进行了一些更改并遇到污染内核警告后,即使我将代码恢复到以前的版本,printk 也将不再工作。然后,如果我只是复制以前的代码以创建另一个具有不同名称的模块,它将再次工作......我不确定它是否是一个错误,但它是可重现的。
以下是运行良好的基本代码。我可以在 /var/log/messages 中看到 printk 消息
嗅探器.c
#include <linux/module.h>
static int __init sniffer_init(void)
{
printk(KERN_INFO "sniffer is initializing...");
printk(KERN_INFO "done!\n");
return 0;
}
static void __exit sniffer_exit(void)
{
printk(KERN_INFO "sniffer is cleaning up...");
printk(KERN_INFO "done!\n");
}
MODULE_AUTHOR("xyz");
MODULE_LICENSE("GPL");
module_init(sniffer_init);
module_exit(sniffer_exit);
生成文件
obj-m += sniffer.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
然后我进行了更改,这只是对多文件模块的测试
嗅探器.c
#include <linux/module.h>
static int __init sniffer_init(void)
{
printk(KERN_INFO "sniffer is initializing...");
test_handler();
printk(KERN_INFO "done!\n");
return 0;
}
static void __exit sniffer_exit(void)
{
printk(KERN_INFO "sniffer is cleaning up...");
printk(KERN_INFO "done!\n");
}
MODULE_AUTHOR("WEICHAO HUANG");
MODULE_LICENSE("GPL");
module_init(sniffer_init);
module_exit(sniffer_exit);
生成文件
obj-m += sniffer.o
sniffer-objs := proto_handler.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
proto_handler.c
#include <linux/module.h>
void test_handler(void)
{
printk(KERN_INFO "this is a test");
}
proto_handler.h
void test_handler(void);
然后,在我制作并运行 insmod 之后,我在 /var/log/messages 中看到了这些消息
嗅探器:模块许可证“未指定”污染内核
由于内核污染而禁用锁定调试
首先,我不知道为什么会显示这些消息,因为我指定了我的许可证。
其次,在看到这些消息后,我再也无法通过运行 insmod 或 rmmod 看到该模块的 printk 的结果,即使我恢复了我的代码。但正如我所说,我可以将以前的代码复制到具有其他名称的模块中,它会再次工作。Linux中有类似黑名单的东西吗?
谁能帮我?非常感谢!