模块继续

来源:互联网 发布:手机制作字幕软件 编辑:程序博客网 时间:2024/05/02 00:20
模块的加载函数
加载函数一般以 __init标识声明.如下
static int __init initialization_function(void)//注意__init标识
{
/*初始化代码*/
}
module_init(initialization_function);
上面是模块的加载函数,他返回整形值,初始化成功,则返回0,在Linux里,初始化失败返回一个接近于零的负值为错误
代码。
在内核当中则是调用request_module(const char *fmt,...);
驱动开发人员可以调用下列代码:
request_module(module_name);
灵活加载其他内核模块。
Linux 中,所有标识为__init 的函数如果直接编译进内核,在链接的时候都会放在.init.text这个区段内。
#define __init      __attribute__{(__section__{".init.text"})}

所有的__init函数在区段.initcall.init中保存了一份函数指针。在初始化的时候内核会通过这些函数指针调用这些__init
函数。并在初始化完成后,释放init区段。
除了函数以外,数据也可以被定义为__initdata,对于只是初始化需要的数据,内核在初始化完成后也可以释放他们占用的
内存。
static int hello_data __initdata = 1;

模块的卸载函数。 
static void __exit cleanup_dunction(void)
{
/*释放代码*/
}
module_exit(cleanup_function);
模块参数
可以使用 "module_param(参数名,参数类型,参数读/写权限);" 为模块定义一个序参数,如下:
static char *book_name = "dissecting Linux Device Driver";
module_param(book_name,charp,S_IRUGO);

static int book_num = 4000;
module_param(book_num,int,S_IRUGO);

在装载模块的时候用户可以像模块传递参数,形式为insmode 或者 modprobe 模块名=参数名。不传递的话直接使用模块定义
的缺省值。
参数类型可以是 byte,short,ushort,int uint,long,ulong,charp(字符指针),bool,invbool(布尔的反)。
除此之外,模块也可以拥有参数数组,形式为: module_param_array(数组名,数组类型,数组长,参数读、写权限);
模块加载后,在 /sys/module 目录下将出现以此模块命名的目录。
运行insmod或者modprobe命令时,应使用逗号分隔输入的数组元素。
定义一个包含两个参数的模块。

/*
*a aimple kernel module supporting aprameters
*
*Licensed under GPLv2 or later
*
*/
 
#include <linux/init.h>
#include <linux/module.h>
 
static char *book_name = "dissecting Linux Device Driver";
module_param(book_name,charp,S_IRUGO);
 
static int book_num = 4000;
module_param(book_num,int,S_IRUGO);
 
static int __init book_init(void)
{
printk(KERN_INFO"book name:%s\n",book_name);
printk(KERN_INFO"book num:%d\n",book_num);
return 0;
}
module_init(book_init);
 
static void __exit book_exit(void)
{
printk(KERN_INFO"book module exit\n");
}
module_exit(book_exit);
 
MODULE_AUTHER();
MODULE_LICENSE("GPL v2");
MODULE_VERSION("V1.0");
 
0 0