Linux insmod加载(驱动)模块时传递参数

在应用程序中,我们可以给main函数传递参数,而在加载驱动模块时,我们也可以使用module_param()来传递参数

一、应用程序main函数传参

例如如下应用程序段:


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()为一个宏,表示向当前模块传递参数,该宏定义在<linux/moduleparam.h>中

使用说明:

原型: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表示文件其他用户的权限为只读。

例如:

int irq;

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 <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!

转自:https://blog.csdn.net/Top_hxl_dq/article/details/74935893

猜你喜欢

转载自blog.csdn.net/SweeNeil/article/details/88814830