一、使用模块传递参数的原因:
安装同一个模块时给模块指定不同的功能特性,给模块传递参数可以实现不同功能选择。
二、配备的条件:
Linux kernel提供了一个简单的框架,其允许驱动程序声明参数,并且用户在系统启动或模块加载时为参数指定相应值。
三、特点:
在驱动程序里,参数的用法如同全局变量。
四、需包含头文件:
#include <Linux/moduleparam.h>
五、步骤:
首先将获取参数值的变量声明为全局变量,然后使用宏module_param()[在头文件Linux/moduleparam.h中]。
运行时,insmod将给变量赋予命令行的参数,如同insmod module.ko var="zhangsan"。为使代码清晰,变量的声明和宏都应该放在模块代码的开始部分。
六、module_param()介绍
该宏被定义在include/linux/module.h文件中。具体定义如下:
#define module_param(name,type,perm) module_param_named(name,name,type,perm)
module_param 使用了3个参数:变量名name、类型type、以及一个权限掩码。
这个宏应当放在任何函数之外,典型的就是出现在源文件的前面。
模块参数支持许多类型:bool、invbool、charp(字符指针值,内存为用户提供的字符串分配,指针因此设置)
int,long,short,uint,ushort:基本的变长整型值。
需要传递多个参数可以通过宏module_param_array()实现:
module_param_array(name,type,num,perm);
参数说明如下:
name:数组的名字(也是参数名)。
type:数组元素的类型。
num:存放数组元素个数的指针,模块加载者拒绝比数组能放下的多的值。
perm:通常的权限值。
perm参数的作用:module_param字段是一个权限值,perm值可以控制谁可以存取这些模块参数在sysfs中的表示。如果perm被设置为0,就根本没有sysfs项;否则,它出现在/sys/module下面,带有给定的权限。使用S_IRUGO作为参数可以作为被所有人读取,但是不能改变;S_IRUGO|S_IWUSR允许root来改变参数。
限权在include/linux/stat.h中定义:
#define S_IRUSR 00400 文件所有者可读
#define S_IWUSR 00200 文件所有者可写
#define S_IXUSR 00100 文件所有者可执行
#define S_IRGRP 00040 与文件所有者同组的用户可读
#define S_IWGRP 00020
#define S_IXGRP 00010
#define S_IROTH 00004 与文件所有者不同组的用户可读
#define S_IWOTH 00002
#define S_IXOTH 00001
七、通过宏MODULE_PARM_DESC()对参数进行说明:
static unsigned short size=1;
module_param(size,ushort,0644);
MODULE_PARM_DESC(size,"The size in inches of fishing pole" "connected to this computer.");
传递数组示例代码片段:
static int arr[MAX_FISH];
static int nr_arr;
module_param_array(arr,int,&nr_arr,0444);
八、总结模块参数实现的步骤:
- 定义一个全局变量
- 使用module_param(name,type,perm)或者module_param_array(name,type,num,perm)来说明变量是一个全局参数。
- 使用MODULE_PARM_DESC(name,desc);来对参数进行描述,解释说明。
九、注意事项:
module_param()和module_param_array()最后一个参数权限值不能包含让普通用户也有写的权限,否者编译报错。可参考linux/moduleparam.h中的_module_param_call()的定义。