Linux 如何调用module_init宏?

Linux 如何调用module_init宏?,linux,linux-kernel,linux-device-driver,Linux,Linux Kernel,Linux Device Driver,我正在编写一个简单的char设备驱动程序。我们传递给模块_init()的函数在模块安装时被调用 当我们使用insmod命令插入模块时,调用传递给模块_init()的函数 是否有其他方法调用此模块_init()函数 如果您正在谈论使用的不是insmod,那么no:insmod是我知道的初始化模块的唯一方法 否则,这个module_init是一个宏,实际上不是一个函数调用(在C中不能从全局范围调用函数)。它扩展到一些预定义的“模块构造函数”,调用您的初始化函数,具体取决于您是作为动态模块还是作为内置

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

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


是否有其他方法调用此模块_init()函数

如果您正在谈论使用的不是
insmod
,那么no:
insmod
是我知道的初始化模块的唯一方法

否则,这个
module_init
是一个宏,实际上不是一个函数调用(在C中不能从全局范围调用函数)。它扩展到一些预定义的“模块构造函数”,调用您的初始化函数,具体取决于您是作为动态模块还是作为内置到内核中的对象进行编译。它的作用是在开发模块时避免过多地使用
#ifdef
,从而简化开发过程(请参阅)

因此,如果出于某种原因(但我不鼓励您这样做),您希望从模块代码中调用初始化函数,那么直接调用它即可。例如:

static void some\u other\u函数(void){
// ...
初始化();
// ...
}
静态int初始化(void){
//您的初始化代码
}
模块初始化(初始化);
编辑:在Eugene的评论之后删除
\u init

但是,我建议仅使用
模块_init
扩展调用初始化函数,并将其他常用代码放在单独的函数中:

static void some\u other\u函数(void){
// ...
之后可能会被称为的东西;
// ...
}
静态整型初始化(无效){
//您的初始化代码(仅完成一次)
之后可能会被称为的东西;
//其他一些一次性代码
}
模块初始化(初始化);

如果要在模块完成初始化后直接从本例调用
initialize()
,我想最好不要用
\uu init
标记它。以这种方式标记的函数(以及用
\uu init\u data
标记的数据)在模块初始化完成后由加载程序从内存中卸载。因此,在此之后调用它们将导致内核oops。如果它们没有标记为
\uuu init
,它们将保留在内存中并可以调用。但我同意@eepp,最好不要这样做,而是使用单独的函数。