1

我正在编写一个简单的字符设备驱动程序。我们传递给 module_init() 的函数在模块安装时被调用。

当我们使用 insmod 命令插入模块时,传递给 module_init() 的函数被调用。

有没有其他方法可以调用这个 module_init() 函数。

4

1 回答 1

3

如果您正在谈论使用除 之外的其他东西insmod,那么 no: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);
于 2012-07-20T16:52:38.413 回答