我正在写一个简单的char设备驱动程序。我们传递给module_init()的函数在安装模块时调用。
当我们使用insmod命令插入模块时,会调用传递给module_init()的函数。
是否有其他方法调用此module_init()函数。
最佳答案
如果您正在谈论使用的不是insmod
,那么no:insmod
是我知道的初始化模块的唯一方法。
否则,这是一个宏,并不是真正的函数调用(在c中不能从全局范围调用函数)。它扩展到一些预定义的“模块构造函数”,调用初始化函数,具体取决于编译时是作为动态模块还是作为内置到内核中的对象。它的作用是在开发模块和简化开发过程时避免大量module_init
(参见this)。
因此,如果出于某种原因(但我不鼓励您这样做),您想从模块代码中调用初始化函数,那么直接调用它就可以了。例如:
static void some_other_function(void) {
// ...
initialize();
// ...
}
static int initialize(void) {
// your initialization code
}
module_init(initialize);
编辑:删除了尤金的评论。
但是,我建议只有
#ifdef
扩展调用初始化函数,其他公共代码放在单独的函数中: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);
关于linux - 如何调用module_init宏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11578948/