天下

记录修行的印记

module_param()说明

module_param()说明
在用户态下编程可以通过main()的来传递命令行参数,而编写一个内核模块则通过module_param() 
module_param宏是Linux 
2.6内核中新增的,该宏被定义在include/linux/moduleparam.h文件中,具体定义如下:

#define module_param(name, type, perm)      \
    module_param_named(name, name, type, perm)

其中使用了 
3 个参数:要传递的参数变量名, 变量的数据类型, 以及访问参数的权限。

perm参数的作用是什么?

最后的 module_param 字段是一个权限值,表示此参数在sysfs文件系统中所对应的文件节点的属性。你应当使用 
<linux/stat.h> 中定义的值. 这个值控制谁可以存取这些模块参数在 sysfs 中的表示.当perm为0时,表示此参数不存在 sysfs文件系统下对应的文件节点。 否则, 模块被加载后,在/sys/module/ 目录下将出现以此模块名命名的目录, 带有给定的权限.。
权限在include
/linux/stat.h中有定义
比如:
#define S_IRWXU 00700
#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100

#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010

#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002
#define S_IXOTH 00001

使用 S_IRUGO 作为参数可以被所有人读取, 但是不能改变; S_IRUGO
|S_IWUSR 允许 root 来改变参数. 注意, 如果一个参数被 sysfs 修改, 你的模块看到的参数值也改变了, 但是你的模块没有任何其他的通知. 你应当不要使模块参数可写, 除非你准备好检测这个改变并且因而作出反应.

>>> 

这个宏定义应当放在任何函数之外, 典型地是出现在源文件的前面.定义如:

static char *whom = "world";
static int howmany = 1;
module_param(howmany, 
int, S_IRUGO);
module_param(whom, charp, S_IRUGO);

模块参数支持许多类型:
bool 
invbool 
一个布尔型( 
true 或者 false)值(相关的变量应当是 int 类型). invbool 类型颠倒了值, 所以真值变成 false, 反之亦然. 

charp :一个字符指针值. 内存为用户提供的字串分配, 指针因此设置. 
int 
long 
short 
uint 
ulong 
ushort 
基本的变长整型值. 以 u 开头的是无符号值. 

数组参数, 用逗号间隔的列表提供的值, 模块加载者也支持. 声明一个数组参数, 使用: 
module_param_array(name,type,num,perm); 

这里 name 是你的数组的名子(也是参数名), 
type 是数组元素的类型, 
num 是一个整型变量, 
perm 是通常的权限值. 

如果数组参数在加载时设置, num 被设置成提供的数的个数. 模块加载者拒绝比数组能放下的多的值. 

测试模块,源程序hello.c内容如下: 

#include 
<linux/init.h> 
#include 
<linux/module.h>
#include 
<linux/moduleparam.h>         

MODULE_LICENSE(
"Dual BSD/GPL");     

static char *who= "world";             
static int times = 1;       
module_param(times,
int,S_IRUSR);     
module_param(who,charp,S_IRUSR);   

static int hello_init(void)       
{
    
int i;
    
for(i=0;i<times;i++)
       printk(KERN_ALERT 
"(%d) hello, %s!\n",i,who);
     
return 0;
}

static void hello_exit(void
{
    printk(KERN_ALERT
"Goodbye, %s!\n",who);
}

module_init(hello_init);
module_exit(hello_exit);

编译生成可执行文件hello

插入: 
# insmod hello.ko who
="world" times=5 

出现5次
"hello,world!": 

#(
1)hello,world! 
#(
2)hello,world! 
#(
3)hello,world! 
#(
4)hello,world! 
#(
5)hello,world! 

卸载: 
# rmmod hello 

出现: 
#Goodbye,world
!

posted on 2012-11-06 15:54 天下 阅读(396) 评论(0)  编辑 收藏 引用 所属分类: kernel & Driver


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2012年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

常用链接

留言簿(4)

随笔分类(377)

随笔档案(327)

链接

最新随笔

搜索

最新评论