2012-10-12 23 views
8

我正在製作一個非常簡單的hello world內核模塊並獲得一些瘋狂的行爲。這工作,直到我升級到內核3.3.8,現在它...呃,它是在退出時調用init函數,並在初始化時調用exit函數。我確信我的名字是正確的內核模塊初始化和退出函數調用順序錯誤

// 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); 

輸出示例:

根@ cop4610:/home/cop4610/Downloads/linux-3.3.8/mymodule#用insmod mymodule.ko根@ cop4610:/home/cop4610/Downloads/linux-3.3.8/mymodule# 尾的/ var/log/syslog的10月12日10時08分20秒cop4610內核:[633.567832] 模塊被卸載,這是printk的

以下是這個happ的視頻直播: http://www.youtube.com/watch?v=8aJNSpCd7as&feature=youtu.be

+0

是否已進行了改造升級後的模塊? –

+0

自內核升級以來,我從頭開始重新編譯它;) – Ben

+0

是__init和__exit宏現在是可選的嗎? –

回答

13

它需要一個換行符!!!!!! Arrggg!

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

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

現在看來,這並沒有真正做出來的秩序,它只是出現了,因爲第一個是沒有顯示出來,直到第二個已作爲緩衝沒有被沖洗。

+1

感謝分享解決方案。我遇到同樣的問題,感到困惑。現在看到你的答案後,它是有道理的。 – russoue

+0

感謝您分享解決方案。 – Midhun

1

這是我的基本的例子:

#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