module_init是Linux内核中的一个宏,用于将某个函数定义为该模块的初始化函数,即在模块加载的时候被调用。在内核加载模块时,该宏所指定的函数将被调用,完成模块的初始化工作。
module_init的定义位于/usr/src/linux/include/linux/init.h中,其实现是通过__init宏实现,该宏的作用是告诉编译器该函数只会被调用一次,避免不必要的内存占用。
在Linux内核中,模块是一种在内核运行时可以动态加载和卸载的代码,不需要重新编译内核即可添加或删除功能。模块初始化函数在模块被加载时运行,完成一些必要的初始化工作,例如注册设备或初始化系统调用。如果没有正确地初始化,将无法使用该功能。因此,module_init非常重要,其作用是保证模块在加载时进行正确的初始化。
与module_init对应的是module_exit,用于将某个函数定义为该模块的退出函数,在模块卸载的时候被调用。在模块被卸载时,该宏所指定的函数将被调用,完成模块的清理工作。
需要注意的是,当模块卸载时,如果没有正确地进行清理工作,将可能产生严重的问题,例如内存泄漏等。因此,module_exit也非常重要,其作用是保证模块在被卸载时进行正确的清理工作。
以下代码为一个简单的模块示例,其中使用了module_init和module_exit宏。
#include <linux/module.h>#include <linux/kernel.h>
static int __init hello_init(void)
printk(KERN_INFO "Hello, World!\n");
return 0;
static void __exit hello_exit(void)
printk(KERN_INFO "Goodbye, World!\n");
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple example Linux module.");
该模块定义了两个函数hello_init和hello_exit,在模块加载和卸载时被调用。其中hello_init函数在模块加载时打印一条消息,hello_exit函数在模块卸载时打印另一条消息。最后,使用module_init和module_exit宏将这两个函数定义为该模块的初始化和退出函数,并使用MODULE_LICENSE、MODULE_AUTHOR和MODULE_DESCRIPTION宏定义了一些模块属性。