Linux内核模块的代码框架通常由下面几个部分组成:
#include
#include
#include
static int __init hello_init(void)
{
printk(KERN_EMERG "[ KERN_EMERG ] Hello Module Init\n");
printk( "[ default ] Hello Module Init\n");
return 0;
}
static void __exit hello_exit(void)
{
printk("[ default ] Hello Module Exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL2");
MODULE_AUTHOR("Ye");
MODULE_DESCRIPTION("hello module");
MODULE_ALIAS("test_module");
__init 、__initdata 宏 定 义
#define __init __section(.init.text)
#define __initdata __section(.init.data)
#define __exitdata __section(.exit.data)
#define __exit __section(.exit.text) __exitused __cold notrace
以上代码**__init 、__initdata宏定义(位于内核源码/linux/init.h)中的__init 用于修饰函数, __initdata用于修饰变量。带有init的修饰符,表示将该函数放到可执行文件的__init节区中,该节区的
内容只能用于模块的初始化阶段,初始化阶段执行完毕之后,这部分的内容就会被释放掉。 __exit用于修饰函数,__exitdata**用于修饰变量
告诉内核,当卸载模块时,需要调用哪个函数。
module_init / module_exit
#define module_init(x) __initcall(x);
#define module_exit(x) __exitcall(x);
宏定义 module_init 用于通知内核初始化模块的时候,要使用哪个函数进行初始化。它会将函数地址加入到相应的节区 section 中,这样的话,开机的时候就可以自动加载模块了。 内核模块卸载函数 module_init 主要是用于释放初始化阶段分配的内存,分配的设备号等,是初始化过程的逆过程。