内核模块初始化和退出函数调用顺序错误

我正在做一个非常简单的hello世界内核模块,并得到一些疯狂的行为。 这工作,直到我升级到内核3.3.8,现在它…呃,它是在退出时调用init函数,并在初始化的exitfunction。 我确定我的名字是正确的

 // Needed for module definitions #include <linux/module.h> // Needed for initilization modules #include <linux/init.h> // Must declare some license MODULE_LICENSE("Dual BSD/GPL"); // Function to be called on insmod // Returns 0 on success static int __init mymod_init(void) { // Prints kernel alert. Check /var/log/syslog printk(KERN_ALERT "Module was loaded, this is the printk."); return 0; } // Function to be called on rmmod static void __exit mymod_exit(void) { // Prints kernel alert. Check /var/log/syslog printk(KERN_ALERT "Module was unloaded, this is the printk"); } // Register these functions module_init(mymod_init); module_exit(mymod_exit); 

示例输出:

root @ cop4610:/home/cop4610/Downloads/linux-3.3.8/mymodule# insmod mymodule.ko root @ cop4610:/home/cop4610/Downloads/linux-3.3.8/mymodule# tail / var / log / syslog Oct 12 10:08:20 cop4610内核:[633.567832]模块被卸载了,这是printk

以下是现场直播的video: http : //www.youtube.com/watch?v= 8aJNSpCd7as&feature= youtu.be

它需要一个换行符!!!!!! Arrggg!

  printk(KERN_ALERT "modulee was unloaded, this is the printk\n"); 

  printk(KERN_ALERT "modulee was loaded, this is the printk\n"); 

看起来并没有把它们搞乱,只是看起来像,因为第一个没有显示出来,直到第二个发出,因为缓冲区没有被刷新。

这是我的基本例子:

 #include <linux/module.h> #include <linux/kernel.h> #define MODULE_NAME "hello_md" MODULE_LICENSE("GPL"); MODULE_AUTHOR("B3h3m0th"); MODULE_DESCRIPTION("Basic LKM; hello world module"); MODULE_VERSION("0.0"); static int __init insert_mod(void) { printk(KERN_ALERT "[%s] Init: \"Hello World\"\n", MODULE_NAME); return 0; } static void __exit remove_mod(void) { printk(KERN_ALERT "[%s] Exit\n", MODULE_NAME); } module_init(insert_mod); module_exit(remove_mod); 

我的基本Makefile:

 obj-m += basic_module.o KERNELVERSION = $(shell uname -r) all: $(MAKE) -C /lib/modules/$(KERNELVERSION)/build M=$(PWD) modules clean: $(MAKE) -C /lib/modules/$(KERNELVERSION)/build M=$(PWD) clean