内核模块 module_param()传递参数



module_param

static char *book_name = "dissecting Linux Device Driver";
static int num = 4000;
module_param(num, int, S_IRUGO);                                
module_param(book_name, charp, S_IRUGO);
                                

在用户态下编程可以通过main()的参数来传递命令行参数,而编写一个内核模块则通过module_param()来传递参数。

外文名

 

module_param

通    过

main()的参数

包    含

传递命令行参数

包    括

 

通过module_param()来传递参数

目录

 

1简介

 

2内核模块参数简介

 

3内核模块参数数组简介

 

4问题解答

 

5测试模块

 

1

 

简介

编辑

 

在用户态下编程可以通过main(intargc,char*argv[])的参数来传递命令行参数,而编写一个内核模块则通过module_param()来传递参数。

 

例如,应用程序命令行传参:

 

intmain(intargc,char*argv[])/*argc:命令行参数个数,argv:命令行参数信息*/

{

 

/* 函数体 */

 

return0;

 

}

 

运行:./a.out100200

 

其中:argc=3

 

argv[0]=“./a.out”

 

argv[1]=“100”

 

argv[2]=“200”

 

module_param(nametypeperm)是一个宏,表示向当前模块传入参数。参数用 module_param 宏定义来声明, 它定义在 moduleparam.h中。

 

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

 

static char *whom = "world";

 

static int howmany = 1;

 

module_param(howmanyintS_IRUGO);

 

module_param(whom, charp, S_IRUGO);

 2

 

内核模块参数简介

编辑

module_param(name,type,perm);

 

功能:指定模块参数,用于在加载模块时或者模块加载以后传递参数给模块。

参数: 

name:模块参数的名称

type: 模块参数的数据类型

perm: 模块参数的访问权限

其中参数type可以取以下任意一种情况: 

bool : 布尔型

inbool : 布尔反值

charp: 字符指针(相当于char *,不超过1024字节的字符串)

short: 短整型

ushort : 无符号短整型

int : 整型

uint : 无符号整型

long : 长整型

ulong: 无符号长整型

参数perm表示此参数在sysfs文件系统中所对应的文件节点的属性,其权限在include/linux/stat.h中有定义。它的取值可以用宏定义,也可以有数字法表示。

 

宏定义有:

 

#defineS_IRUSR 00400文件所有者可读

 

#defineS_IWUSR00200文件所有者可写

#defineS_IXUSR 00100文件所有者可执行

#defineS_IRGRP00040与文件所有者同组的用户可读

#defineS_IWGRP00020

#defineS_IXGRP 00010

#defineS_IROTH 00004与文件所有者不同组的用户可读

#defineS_IWOTH00002

#defineS_IXOTH 00001

 

将数字最后三位转化为二进制:xxx xxx xxx,高位往低位依次看,第一位为1表示文件所有者可读,第二位为1表示文件所有者可写,第三位为1表示文件所有者可执行;接下来三位表示文件所有者同组成员的权限;再下来三位为不同组用户权限.

00400 ==> 400 ==> 100 000 000

数字法:1表示执行权限,2表示写入权限,4表示读取权限。

一般用8进制表示即可,如0664。从左向右看,第一位的0表示八进制的意思,第二位的6表示文件所有者的权限为可读可写,第三位的6表示文件同组用户的权限为可读可写,第四位的4表示文件其他用户的权限为只读。

例如:

intirq;

char*pstr;

module_param(irq,int,0664);

module_param(pstr,charp,0000);

 

3 

内核模块参数数组简介

module_param_array(name,type,nump,perm);

参数:

name:模块参数的名称

type: 模块参数的数据类型

nump:数组元素个数指针

perm: 模块参数的访问权限

例如:

staticintfish[10];

staticintnr_fish;

module_param_array(fish,int,&nr_fish,0664);

nr_fish:保存最终传递数组元素个数,不能大于10个


4

 

问题解答 

perm参数的作用是什么?

最后的 module_param 字段是一个权限值; 你应当使用 <linux/stat.h> 中定义的值. 这个值控制谁可以存取这些模块参数在 sysfs 中的表示.如果 perm 被设为 0, 就根本没有 sysfs 项. 否则, 它出现在 /sys/module下面, 带有给定的权限. 使用 S_IRUGO 作为参数可以被所有人读取, 但是不能改变; S_IRUGO|S_IWUSR 允许 root 来改变参数. 注意, 如果一个参数被 sysfs 修改, 你的模块看到的参数值也改变了, 但是你的模块没有任何其他的通知. 你应当不要使模块参数可写, 除非你准备好检测这个改变并且因而作出反应.


5

 

测试模块

 

源程序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 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!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值