Chinaunix首页 | 论坛 | 博客
  • 博客访问: 377123
  • 博文数量: 82
  • 博客积分: 1104
  • 博客等级: 少尉
  • 技术积分: 926
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-16 15:14
文章分类
文章存档

2012年(82)

分类: LINUX

2012-05-16 15:57:44

LDD3-第二章-构造和运行模块-模块参数
对module_param_array(name,type,num,perm)产生疑问,尤其对num参数的作用产生疑问,搜索得到结果如下。

转:
Linux设备驱动程序学习(0)-Hello, world模块
http://blog.chinaunix.net/uid-7332782-id-3207026.html


  1. static int param_array[] = {0,0,0,0};
  2. static int param_array_nr;
  3. module_param_array(param_array , int , &param_array_nr , S_IRUGO)
  4.   
  5.  for (i = 0; i < param_array_nr; i++)    {
  6.         printk(KERN_ALERT "param_array[%d] : %d \n", i, param_array[i]);
  1. root@tekkaman:~# insmod hello_linux.ko param_array=9,8,7,6
  2. Hello, Linux !
  3. (0) Hello, Tekkaman
  4. param_array[0] : 9
  5. param_array[1] : 8
  6. param_array[2] : 7
  7. param_array[3] : 6
  8. root@tekkaman:~# rmmod hello_linux.ko
  9. Goodbye, Linux !
  10. root@tekkaman:~# insmod hello_linux.ko param_array=9,8,7,6,5
  11. param_array: can only take 4 arguments
     
     module_param_array
(param_array , int , &param_array_nr , S_IRUGO);
&param_array_nr是用于保存模块加载时输入数组参数的成员数目的。
以前我错误的以为这个是输入参数,其实这个用于内核模块加载器输出的。


续转:

模块传递参数的概念

    对于如何向模块传递参数,Linux kernel 提供了一个简单的框架。其允许驱动程序声明参数,并且用户在系统启动或模块装载时为参数指定相应值。在驱动程序里,参数的用法如同全局变量。

模块参数传入API

    模块传入参数编程接口包含在头文件中,它们其实是宏函数如表所示。

表 宏函数

module_param

 

函数原型

module_paramnametypeperm);

函数功能

定义一个模块参数,类型由参数type指定

 

 

函数参数

n            name:既是用户看到的参数名,又是
模块内接受参数的变量

n            type:表示参数的数据类型,是byte
short
ushort intuintlongulong
charp
bool invbool

n            perm:指定了在sysfs中相应文件的访问
权限。访问权限与Linux文件访问权限相同,
0644,或使用stat.h中的宏如S_IRUGO
示。0表示完全关闭在sysfs中相对应的项

 

 

 

范例

这类的宏函数并不会声明变量,因此在使用宏之前
,必须声明变量,另外参数变量必须是全局型
(放在模块源文件开头),典型用法如下:

static unsigned int int_var = 0

module_paramint_var uintS_IRUGO);

如果模块参数是一个字符串时,通常使用charp
型定义这个模块参数。内核复制用户提供的字符串到
内存,并且相对应的变量指向这个字符串。例如:

static char *name

module_paramname charp 0);

module_param_named

 

函数原型

module_param_namednamevariable
type
perm);

函数功能

定义一个模块参数,模块内部的变量名与外部的
参数名有不同的名字

 

函数参数

n            name:外部可见的参数名

n            variable:源文件内部的全局变量名

其他参数同module_param

范例

static unsigned int max_test = 9

module_param_namemaximum_
line_test
max_testint0);

module_param_string

 

函数原型

module_param_stringnamestring
lenperm);

函数功能

定义一个模块字符串参数,并让内核在模块插
入时把命令行的字符串参数直接复制到程
序中的字符数组中

续表

module_param_string

 

 

函数参数

n            name:外部可见的参数名

n            string:内部的变量名

n            len:以string命名的buffer大小(可以
小于buffer的大小,但是没有意义)

n            permsysfs的访问权限(或者perm是零,
表示完全关闭相对应的sysfs项)

范例

static char species[BUF_LEN]

module_param_stringspecifies, 
species, BUF_LEN, 0

module_param_array

 

函数原型

module_param_arrayname, type, nump, perm);

函数功能

定义一个模块参数数组,并让内核在模块插入
时把命令行中以逗号分开的参数序列传入该模块
参数数组中。如果内部的数组名与外
部的参数名不同,可以使用:
module_param_array_namedname, 
array, type, nump, perm
);

 

 

 

 

函数参数

n            name:模块参数数组,既是外部模块的参
数名又是程序内部的变量名,该数组必须静态分配

n            type:表示参数的数据类型

n            nump:指向一个整数,其值表示有多少个参
数存放在数组name中,NULL 表示不关心用
户提供的个数

n            permsysfs的访问权限

 

注意

如果name表示字符串数组时,其中的字符串
似乎不能包含逗号,否则一个字符串会被解析成两个

 

 

范例

static int fish[MAX_FISH]

static int nr_fish

//最终传递数组元素个数存在nr_fish

module_param_arrayfish int
&nr_fish0444);

    
    注意 以上宏函数的参数perm表示的权限值不能包含让普通用户也有写权限,否则编译报错。这点可参考linux/moduleparam.h 中 __module_param_call()宏的定义。
阅读(2395) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~