module_param()

转载 2015年11月19日 10:35:09
用户态下编程可以通过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(name, type, perm)是一个宏,表示向当前模块传入参数。参数用 module_param 宏定义来声明, 它定义在 moduleparam.h中。
这个宏定义应当放在任何函数之外, 典型地是出现在源文件的前面.定义如:
static char *whom = "world";
static int howmany = 1;
module_param(howmany, int, S_IRUGO);
module_param(whom, charp, S_IRUGO);

内核模块参数简介编辑

module_param(name,type,perm);
功能:指定模块参数,用于在加载模块时或者模块加载以后传递参数给模块。
参数:
name:模块参数的名称
type: 模块参数的数据类型
perm: 模块参数的访问权限
其中参数type可以取以下任意一种情况:
inbool : 布尔反值
charp: 字符指针(相当于char *,不超过1024字节的字符串)
short: 短整型
ushort : 无符号短整型
int : 整型
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);

内核模块参数数组简介编辑

module_param_array( name, type, nump, perm);
参数:
name:模块参数的名称
type: 模块参数的数据类型
nump:数组元素个数指针
perm: 模块参数的访问权限
例如:
staticintfish[10];
static int nr_fish;
module_param_array( fish, int, &nr_fish, 0664);
nr_fish:保存最终传递数组元素个数,不能大于10个

问题解答编辑

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

测试模块编辑

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

相关文章推荐

module_param

  • 2012-11-06 00:51
  • 32KB
  • 下载

Linux之module_param()函数学习

http://www.linuxidc.com/Linux/2011-02/32131.htm 一.module_param 1.为什么引入  在用户态下编程可以通过main()来传递命令行参...

Linux内核module_param的使用

1.定义模块参数的方法:module_param(name, type, perm);其中,name:表示参数的名字; type:表示参数的类型; perm:表示参数的访问权限...

内核状态下参数传递-module_param

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

Linux内核module_param的使用

本博客转载于:http://blog.csdn.net/dysh1985/article/details/7802080 1.定义模块参数的方法: module_param(nam...

高通平台lcm型号通过cmdline向驱动传递参数的过程-module_param_string

高通平台在lk里识别的屏之后,会通过cmdline向内核传递参数 1 cat /proc/cmdline mdss_mdp.panel=1:dsi:0:qcom,mdss_dsi_nt35532...

module_param 在内核编程中的作用

原文出处:http://blog.csdn.net/maopig/article/details/7171700  module_param   在用户态下编程可以通过ma...

linux内核可装载模块(lkm)传参机制 module_param

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

内核模块 module_param()传递参数

 module_param static char *book_name = "dissecting Linux Device Driver"; static int num = 4000; ...

module_param 在内核编程中的作用

module_param   在用户态下编程可以通过main()的来传递命令行参数,而编写一个内核模块则通过module_param()! module_param的作用 一.module_...
  • maopig
  • maopig
  • 2012-01-02 18:14
  • 2611
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)