内核状态下参数传递-module_param
2015-03-06 20:03
295 查看
1.简介
在用户态下编程可以通过main()的参数来传递命令行参数,而编写一个内核模块则通过module_param()来传递参数。
在用户态下编程可以通过main(intargc,char*argv[])的参数来传递命令行参数,而编写一个内核模块则通过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);
3.测试代码
http://git.oschina.net/OpenWrt-X/ldd3/tree/master/driver/2.hellop
在用户态下编程可以通过main()的参数来传递命令行参数,而编写一个内核模块则通过module_param()来传递参数。
在用户态下编程可以通过main(intargc,char*argv[])的参数来传递命令行参数,而编写一个内核模块则通过module_param()来传递参数。
例如,应用程序命令行传参:
int main(intargc,char*argv[])/*argc:命令行参数个数,argv:命令行参数信息*/ { /* 函数体 */ return0; } 运行:./a.out100200 其中:argc=3 argv[0]=“./a.out” argv[1]=“100” argv[2]=“200”
module_param(name, type, perm)是一个宏,表示向当前模块传入参数。参数用 module_param 宏定义来声明, 它定义在 moduleparam.h中。
这个宏定义应当放在任何函数之外, 典型地是出现在源文件的前面.定义如:
MODULE_LICENSE("Dual BSD/GPL"); static char *whom = "world"; static int howmany = 1; module_param(howmany,int,S_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.测试代码
/*************************************************************************测试结果:
> File Name: hello.c
> Author:
> Mail:
> Created Time: 2015年03月05日 星期四 22时17分43秒
************************************************************************/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
MODULE_LICENSE("Dual BSD/GPL"); static char *whom = "world"; static int howmany = 1; module_param(howmany,int,S_IRUGO); module_param(whom,charp,S_IRUGO);
static int hello_init(void)
{
int i;
for(i = 0; i < howmany;++i)
printk(KERN_ALERT"Hello,%s\n",whom);
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT"Goodbye,cruel %s\n",whom);
}
module_init(hello_init);
module_exit(hello_exit);
sudo insmod hellop.ko howmany=10 whom="Mom" dmesg --------------------------------------------------------------------- [ 3844.046504] Hello,Mom [ 3844.046513] Hello,Mom [ 3844.046516] Hello,Mom [ 3844.046518] Hello,Mom [ 3844.046520] Hello,Mom [ 3844.046522] Hello,Mom [ 3844.046524] Hello,Mom [ 3844.046526] Hello,Mom [ 3844.046528] Hello,Mom [ 3844.046530] Hello,Mom ---------------------------------------------------------------------- sudo rmmod hellop demsg ---------------------------------------------------------------------- [ 3886.029760] Goodbye,cruel Mom ----------------------------------------------------------------------代码下载:
http://git.oschina.net/OpenWrt-X/ldd3/tree/master/driver/2.hellop
相关文章推荐
- 使用module_param来向内核模块传递参数
- 使用module_param来向内核模块传递参数
- 使用module_param来向内核模块传递参数
- 使用module_param来向内核模块传递参数
- 内核模块 module_param()传递参数
- module_param内核模块参数传递
- Linux之module_param()--给模块传递参数
- 从命令行传递参数给内核模块 (MODULE_PARM)
- module_param 在模块启动时传递参数
- 内核参数module_param的有关操作
- 高通平台lcm型号通过cmdline向驱动传递参数的过程-module_param_string
- 内核模块编程---使用内核模块参数(module_param()) (2)
- Linux 内核模块参数学习module_param
- 记linux内核处理bootargs到内核并加载模块时传入参数(module_param_named()等)
- Linux内核学习-内核模块参数module_param
- [转]向linux模块驱动传递参数 module_param
- 从命令行传递参数给内核模块 (MODULE_PARM)
- module_param模块函数的作用--用来传递参数
- uboot 参数对应着内核模块的参数 module_param