2012-07-20 28 views
1

我正在寫一個簡單的字符設備驅動程序。我們傳遞給module_init()的函數在模塊安裝時調用。如何調用module_init宏?

當我們使用insmod命令插入模塊時,函數傳遞給module_init()被調用。

是否有任何其他方法調用此module_init()函數。

回答

3

如果你正在談論的是使用insmod以外的東西,那麼編號:insmod是我知道初始化你的模塊的唯一方法。

否則,這module_init東西是一個宏,並不是一個真正的函數調用(你不能從C中的全局範圍調用函數)。它擴展爲一些預定義的「模塊構造函數」,它調用您的初始化函數,具體取決於您是作爲動態模塊編譯還是編譯爲內核中的對象。它的作用是在開發模塊和簡化開發過程時避免必須使用#ifdef(請參閱this)。因此,如果出於某種原因(但我不鼓勵你這樣做),你想從你的模塊代碼中調用你的初始化函數,然後直接調用它。例如:

static void some_other_function(void) { 
    // ... 
    initialize(); 
    // ... 
} 

static int initialize(void) { 
    // your initialization code 
} 

module_init(initialize); 

編輯:以下尤金的評論刪除__init

不過,我建議只module_init擴大需要你的初始化函數和其他共同代碼是在一個單獨的功能:

static void some_other_function(void) { 
    // ... 
    something_that_might_get_called_afterwards_also(); 
    // ... 
} 

static int __init initialize(void) { 
    // your initialization code (done only once) 
    something_that_might_get_called_afterwards_also(); 
    // some other one-time code 
} 

module_init(initialize); 
+3

如果一個人要打電話'初始化()'從這個例子直接在模塊完成初始化之後,我想,最好不要用'__init'標記它。標記爲這種方式的函數(以及用__init_data標記的數據)在模塊初始化完成後由加載程序從內存中卸載。所以在之後調用它們會導致內核哎呀。如果它們沒有用'__init'標記,它們將保留在內存中並且可以被調用。但是我同意@eepp,最好不要這樣做,而應該使用單獨的函數。 – Eugene 2012-07-21 19:15:09