目的:加载模块时,可以向模块传参数
头文件:include/linux/moduleparam.h
(1)传单个参数:module_param(name, type, perm)
* name // 模块参数的名称
* type // 模块参数的数据类型(支持int long short uint ulong ushort类型)
* perm // 模块参数的访问权限(在include/linux/stat.h中定义)
(2)传多个参数: #define module_param_array(name, type, nump, perm)
* name // 模块参数的名称
* type // 模块参数的数据类型(支持int long short uint ulong ushort类型)
* nump // 保存参数个数的地址
* perm // 模块参数的访问权限(在include/linux/stat.h中定义)
perm参数详解:
#define S_IRWXU 00700 // 文件所有者可读写执行
#define S_IRUSR 00400 // 文件所有者可读
#define S_IWUSR 00200 // 文件所有者可写
#define S_IXUSR 00100 // 文件所有者可执行
#define S_IRWXG 00070
#define S_IRGRP 00040 // 文件所有者同组的用户可读
#define S_IWGRP 00020
#define S_IXGRP 00010
#define S_IRWXO 00007
#define S_IROTH 00004 // 与文件所有者不同组的用户可读
#define S_IWOTH 00002
#define S_IXOTH 00001
将数字最后三位转化为二进制:xxx xxx xxx,高位往低位依次看,第一位为1表示文件所有者可读,第二位为1表示文件所有者可写,第三位为1表示文件所有者可执行;接下来三位表示文件所有者同组成员的权限;再下来三位为不同组用户权限
相关代码:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("LSQ");
static int module_arg1,module_arg2;
static int int_array[50];
static int int_num;
module_param(module_arg1, int, S_IRUSR);
module_param(module_arg2, int, S_IRUSR);
module_param_array(int_array, int, &int_num, S_IRUSR);
static int hello_init(void)
{
int i;
printk(KERN_EMERG "module_arg1 is %d\n",module_arg1);
printk(KERN_EMERG "module_arg2 is %d\n",module_arg2);
for(i=0; i < int_num; i++)
{
printk(KERN_EMERG "int_array[%d] is %d\n",
i, int_array[i]);
}
printk(KERN_EMERG "HELLO WORLD enter!\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_EMERG "HELLO WORLD exit!\n");
}
module_init(hello_init);
module_exit(hello_exit);
模块测试:
insmod hello.ko module_arg1=0 module_arg2=20 int_arry=1,2,3,4,5,6,7,8,9
cat /sys/module/hello/parameters/xxx 可以查询参数