module_init
是Linux内核中的一个宏,用于在内核模块加载时执行初始化函数。它接受一个函数作为参数,这个函数会在模块被加载到内核时自动执行。
在Linux内核中,一个模块可以包含多个初始化函数,这些函数可以按照不同的优先级和顺序执行。module_init
宏用于指定模块的入口函数,即模块加载时最先执行的函数。
具体来说,module_init
宏的定义如下:
c复制代码
#define module_init(x) __initcall(x); |
这里,__initcall
是另一个宏,用于将初始化函数添加到内核的初始化函数列表中。__initcall
宏的定义如下:
c复制代码
#define __initcall(fn) device_initcall(fn) |
而device_initcall
宏的定义如下:
c复制代码
#define device_initcall(fn) __define_initcall("6",fn,6) |
最终,__define_initcall
宏会将初始化函数添加到一个特定的段(section)中,这个段在内核启动时会被执行。__define_initcall
宏的定义如下:
c复制代码
#define __define_initcall(level,fn,id) \ | |
static initcall_t __initcall_##fn##id __used \ | |
__attribute__((__section__(".initcall" level ".init"))) = fn |
其中,level
参数指定了初始化函数的优先级,fn
参数是初始化函数的名称,id
参数是一个唯一的标识符,用于区分不同的初始化函数。
在模块代码中,你可以使用module_init
宏来指定模块的入口函数,例如:
c复制代码
static int hello_init(void) { | |
printk("Hello, world!\n"); | |
return 0; | |
} | |
module_init(hello_init); |
在这个例子中,hello_init
函数会在模块加载时被执行,它会打印一条消息到内核日志中。