带参数的可加载模块
宏module_param
(var, type, right)可用于向模块传递命令行参数。参数类型可以是整性,长整型,字符串等类型。
其中var代表参数的名字,type代表参数的类型,right表示参数的访问权限。
type支持的类型有:
bool :布尔类型
invbool:颠倒了值的bool类型;
charp :字符指针类型,内存为用户提供的字符串分配;
int :整型
long :长整型
short :短整型
uint :无符号整型
ulong :无符号长整型
ushort :无符号短整型
module_param中的最后一个成员是访问许可值,我们应使用<linux/stat.h>中存在的定义。
这个值用来控制谁能够访问sysfs中对模块参数的表述。
如果perm被设置为0,就不会有对应的sysfs入口项;否则,模块参数会在/sys/module中出现,并设置为给定的访问许可。
如果对参数使用:
S_IRUGO,则任何人均可读取该参数,但是不能修改。
S_IRUGO|S_IWUSR允许root用户修改该参数。
#include <linux/module.h>
#include <linux/fs.h>
static struct class *parm_class;
static int major = 0;
static const struct file_operations parm_fops = {
.owner = THIS_MODULE,
};
static int int_parm = 0;
module_param(int_parm, int, 0);
static int parm_drv_init(void) {
printk("parm_drv init\n");
printk("received param is %d\n",int_parm);
return 0;
}
static void parm_drv_exit(void) {
printk("param_drv exit\n");
}
module_init(parm_drv_init);
module_exit(parm_drv_exit);
MODULE_LICENSE("GPL");
传递参数时仍需要以名字的方式进行传递。例如sudo insmod parm_drv.ko int_parm=789
多个模块参数之间以空格间隔。例如:
#include <linux/module.h>
#include <linux/fs.h>
static struct class *parm_class;
static int major = 0;
static const struct file_operations parm_fops = {
.owner = THIS_MODULE,
};
static int int_parm1 = 0;
static int int_parm2 = 0;
module_param(int_parm1, int, 0);
module_param(int_parm2, int, 0);
static int parm_drv_init(void) {
printk("parm_drv init\n");
printk("received param1 is %d\n",int_parm1);
printk("received param2 is %d\n",int_parm2);
return 0;
}
static void parm_drv_exit(void) {
printk("param_drv exit\n");
}
module_init(parm_drv_init);
module_exit(parm_drv_exit);
MODULE_LICENSE("GPL");
sudo insmod parm_drv.ko int_parm1=123 int_parm2=234
使用dmesg
命令查看输出的消息。
数组类型模块参数的传递
上面的第二个例子中我们传递了两个int型的参数,除了上述以两个不相关的同类型参数传递外,我们还可以传递数组类型的参数。传递数组类型参数的宏定义为module_param_array(name, type, nump, right);
数组参数之间以 逗号 ,
分隔。
#include <linux/module.h>
#include <linux/fs.h>
static struct class *parm_class;
static int major = 0;
static const struct file_operations parm_fops = {
.owner = THIS_MODULE,
};
static int arr[2] = {8,9};
int len = 2;
module_param_array(arr, int, &len, 0);
static int parm_drv_init(void) {
printk("parm_drv init\n");
printk("received arr[0] is %d\n",arr[0]);
printk("received arr[1] is %d\n",arr[1]);
return 0;
}
static void parm_drv_exit(void) {
printk("param_drv exit\n");
}
module_init(parm_drv_init);
module_exit(parm_drv_exit);
MODULE_LICENSE("GPL");
sudo insmod parm_drv.ko arr=1,2