今天在移植电机驱动的过程中,发现编译脚本在加载该驱动模块的时候,却带的有参数,当时就有点纳闷了。然后经过一段时间的各种查找,终于知道加载驱动模块时传递参数的奥妙;
在应用程序中,我们通过命令行给main函数传递参数,而在加载驱动模块时,我们可以使用module_param()来传递参数;
例如
在如下程序段中
int main(int argc,char *argv[ ])
{
printf("argv[0] %s\n",argv[0]);
printf("argv[1] %s\n",argv[1]);
printf("argc is %d\n",argc);
return 0;
}
当我们编译运行时;
./a.out aaa
那么屏幕上将打印
./a.out
aaa
2
以上打印信息就是我们传递给main函数的参数;
argc为参数的个数,./a.out为第一个参数,aaa为第二个参数;
以上就是在应用程序中通过命令行传递参数的方法;
那么,我们在加载驱动模块的时候也可以通过上述方式传递参数;
module_param()为一个宏,表示向当前模块传递参数;
该宏定义在中;
使用说明:
原型:moudle_param(name,type,perm);
功能:制定模块参数,用于在加载模块时给相关变量传递参数;
参数说明:
name :将要传递参数的变量名称;
type:传递参数的数据类型;
perm:传递参数的访问权限;
其中参数type可以使用以下任意一种类型:
bool:布尔型
inbool:布尔反值
charp:字符指针
short:短整型
int:整型
ushort:无符号短整型
int:整型
uint:无符号整型
long:长整型
ulong:无符号长整型
参数perm表示此参数在sysfs文件系统中所对应的文件节点的属性,其权限在include/linux/stat.h中有定义。
它的取值可以用 宏定义,也可以有数字法表示。
宏定义有:
#define S_IRUSR 00400文件所有者可读
#define S_IWUSR00200文件所有者可写
#define S_IXUSR 00100文件所有者可执行
#define S_IRGRP00040与文件所有者同组的用户可读
#define S_IWGRP00020
#define S_IXGRP 00010
#define S_IROTH 00004与文件所有者不同组的用户可读
#define S_IWOTH00002
#define S_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个
测试模块
编辑
源程序hello.c内容如下:
#include
#include
#include
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
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!