分类: LINUX
2011-06-07 16:12:44
1 #include
2 #include
3
4 static int __init test_init(void) //内核初始化函数
5 {
6 printk("hello world!\n"); //打印函数,和prinft类似
7 return 0;
8 }
9
10 static void __exit test_exit(void)//内核清除函数
11 {
12 printk("good bye!\n");
13 }
14
15 module_init(test_init); //指定初始化函数
16 module_exit(test_exit); //指定清除函数
17
18 MODULE_LICENSE("GPL"); //指定代码使用的许可证
19 MODULE_AUTHOR("xiao bai"); //指定作者
20 MODULE_VERSION("1.0"); //指定代码修订号
内核初始化函数:
static int __init test_init(void) //内核初始化函数
{
}
module_init(test_init); //指定初始化函数
1)初始化函数是在模块加载时自动被调用,执行相关的初始化工作。
2)static和__init都是可以不加的,因为初始化函数除了加载时执行外没有别的用处,加上static只是声明一下,该函数只能在模块内部使用。而加上__init后,它暗示内核该函数仅在初始化时使用,所以在模块被装载后,模块装载器就会把该函数扔掉,释放占用的内存空间。
3)但是moudle_init()是必须要的,因为这样才能让模块加载器知道这是个初始化函数,没有这一步,函数就不会得到调用。
4)初始化函数成功返回0,失败返回对应的错误码。
内核清除函数:
static void __exit test_exit(void)//内核清除函数
{
}
module_exit(test_exit); //指定清除函数
1)内核清除函数是在模块卸载是自动被调用,执行相关的清除工作。
2)同上,static和__exit都是可以不加的,但如果加上__exit,模块直接编译进内核或者不允许卸载,被标志为__exit的函数会被自动丢弃掉。
3)module_exit是必须的,因为这样内核才能找到清除函数。
4)清除函数的没有返回值。
5)一个没有定义清除函数的模块,是不允许被加载的。
模块的描述性定义:
MODULE_LICENSE("GPL"); //指定代码使用的许可证
MODULE_AUTHOR("xiao bai"); //指定作者
MODULE_VERSION("1.0"); //指定代码修订号
1)以上的都是一些都该模块的描述,除了上面的还有
MODULE_ALIAS(模块的别名)
MODULE_DESCRIPTION(描述用途)等。
2)MODULE_LICENSE一般都是要写的,告诉内核该程序使用的许可证,不然在加载时它会提示该模块污染内核。
3)MODULE_声明可以声明在源代码任意位置,但习惯放在代码的最后