我正在写一个简单的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/

10-14 16:30
查看更多