我正在编写一个简单的char设备驱动程序。我们传递给module_init()的函数在模块安装时被调用。
当我们使用insmod命令插入模块时,调用函数传递给module_init()。
是否有其他方法可以调用此module_init()函数。
答案 0 :(得分: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);
修改:根据Eugene的评论删除__init
。
但是,我建议只有module_init
扩展调用您的初始化函数,而其他 common 代码在一个单独的函数中:
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);