2012-07-20 48 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