1
我正在寫一個簡單的字符設備驅動程序。我們傳遞給module_init()的函數在模塊安裝時調用。如何調用module_init宏?
當我們使用insmod命令插入模塊時,函數傳遞給module_init()被調用。
是否有任何其他方法調用此module_init()函數。
我正在寫一個簡單的字符設備驅動程序。我們傳遞給module_init()的函數在模塊安裝時調用。如何調用module_init宏?
當我們使用insmod命令插入模塊時,函數傳遞給module_init()被調用。
是否有任何其他方法調用此module_init()函數。
如果你正在談論的是使用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);
如果一個人要打電話'初始化()'從這個例子直接在模塊完成初始化之後,我想,最好不要用'__init'標記它。標記爲這種方式的函數(以及用__init_data標記的數據)在模塊初始化完成後由加載程序從內存中卸載。所以在之後調用它們會導致內核哎呀。如果它們沒有用'__init'標記,它們將保留在內存中並且可以被調用。但是我同意@eepp,最好不要這樣做,而應該使用單獨的函數。 – Eugene 2012-07-21 19:15:09