Linux驱动程序的模块参数

来源:互联网 发布:上海交大网络空间安全 编辑:程序博客网 时间:2024/05/19 01:33

模块参数

模块参数就是用户在系统启动或挂载模块时指定的参数值,相对于驱动程序它是全局变量。

 

<include/module.h>

通过module_param()定义模块参数:

module_param(name, type, perm);

name – 即为参数名

Type – 参数的类型,可以是byte(存放在char型变量中)、short、ushort、int、uint、long、ulong、charp(char型指针)、bool、invbool(用户转换来的bool型)

perm – 指定模块在sysfs下对应文件的权限,所有者、组内、其他人

值得说明的是,module_param()并没有定义相关变量,在具体使用时,格式如下:

static int km_param = 0;module_param(km_param, bool, 0);       // km_param是全局变量


有时,模块外部参数名称与模块内部变量名称不同,这时需要使用宏module_param_named():

module_param_ named (name, variable, type,perm);

variable – name是外部可见参数名,variable是内部全局变量名。使用格式如下:

static int max _param = 0;module_param_ named(max_km_param, max _param,int, 0);


有时,需要使用一个charp类型定义一个字串,内核将其copy到内存,charp就指向该字串:

static char *name;module_param(name, charp, 0);

另一种可行方法是,让内核直接copy字串到指定的字符数组,使用宏module_param_string():

module_param_string(name, string, len, perm);

name – 外部参数名

string – 对应模块内部参数名

len – 是string命名缓存区的长度

使用格式如下:

static char param_str[LEN];module_param_string(param_string, param_str,LEN, 0);

 

有时,需要接收逗号分隔的参数序列,这时使用宏module_param_array()存储在数组中:

module_param_array(name, type, nump, perm);

nump – 为一个整行指针,该整型存放数组项的个数

使用格式如下:

static int param_array[MAX_PARA];static int num_param;module_param_array(param_array, int, & num_param,0444);

需要注意的是,参数name指定的数组必须静态分配,因为内核在编译时需要确定数组大小,避免造成溢出。

 

同样,也可以使外部参数和模块内部参数不同,使用如下宏:

module_param_array_named(name, array, type,nump, perm);

使用同module_param_ named。


最后,可以描述下用户自己的参数:

static unsigned int cnt = 0;module_param(cnt, uint, 0644);MODULE_PARM_DESC(cnt, “The cnt counts theirq”);
参考资料:
[1] Robert Love, Linux Kernel Development

                                             
0 0
原创粉丝点击