1.函数说明

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

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

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);
 

这里的 S_IRUGO=(S_IRUSR|S_IRGRP|S_IROTH)

S_IRUSR:用户读  00400
S_IRGRP:用户组读 00040
S_IROTH: 其他读 00004
 

2.源码及测试

【源码】

 1 /***************************
 2 *FILE_NAME:mod_param.c
 3 *
 4 **************************/
 5 #include <linux/init.h>
 6 #include <linux/module.h>
 7 
 8 static int mod_num = 10;
 9 module_param(mod_num,int,0644);
10     
11 static char *mod_name = "mod_param";
12 module_param(mod_name,charp,0644);
13 
14 static int __init mod_param_init(void)
15 {
16     printk(KERN_INFO "mod_param_init enter...\n" );
17     printk(KERN_INFO "mod_num: %d\n",mod_num );
18     printk(KERN_INFO "mod_name: %s\n",mod_name );
19 
20     return 0;
21 }
22 
23 static void __exit mod_param_exit(void)
24 {
25     printk(KERN_INFO "mod_param_exit...\n" );
26 }
27 
28 module_init(mod_param_init);
29 module_exit(mod_param_exit);
30 MODULE_DESCRIPTION("mod param test");
31 MODULE_LICENSE("GPL v2");
32 MODULE_AUTHOR("OzTaking");

 

【测试1】使用默认参数

[查看内核打印信息]

【dmesg方法】

 【kern.log方法】

【测试2】从命令行传入参数并修改参数

 

 【注意】

①传入参数的“=”两边不能有空格;

②名称单双引号都行;

 【查看/sys目录下的参数】

 

 

 

版权声明:本文为Oztaking原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Oztaking/p/6762685.html