一.简介
什么是驱动传参:
在装载内核模块时, 用户可以向模块传递参数, 形式为“insmode(或 modprobe) 模块名参数名=参数值” , 如果不传递, 参数将使用模块内定义的缺省值。 如果模块被内置, 就无法 insmod 了。
驱动传参的作用:
设置驱动的相关参数, 比如设置缓冲区的大小。
设置安全校验, 防止我们写的驱动被人盗用。
怎么给驱动传递参数:
参数 type 可以取以下任意一种情况:
bool : 布尔型
inbool : 布尔反值
charp: 字符指针(相当于 char *,不超过 1024 字节的字符串)
short: 短整型
ushort : 无符号短整型
int : 整型
uint : 无符号整型
long : 长整型
ulong: 无符号长整型。
二.驱动模块传参实验
#include <linux/init.h>
#include <linux/module.h>
static int number;//定义 int 类型变量 number
static char *name;//定义 char 类型变量 name
static int para[8];//定义 int 类型的数组
static char str1[10];//定义 char 类型字符串 str1
static int n_para;//定义 int 类型的用来记录 module_param_array 函数传递数组元素个数的变量 n_para
module_param(number, int, S_IRUGO);//传递 int 类型的参数 number,S_IRUGO 表示权限为可读
module_param(name, charp, S_IRUGO);//传递 char 类型变量 name
module_param_array(para , int , &n_para , S_IRUGO);//传递 int 类型的数组变量 para
module_param_string(str, str1 ,sizeof(str1), S_IRUGO);//传递字符串类型的变量 str1
static int __init parameter_init(void)//驱动入口函数
{
static int i;
printk(KERN_EMERG "%d\n",number);
printk(KERN_EMERG "%s\n",name);
for(i = 0; i < n_para; i++)
{
printk(KERN_EMERG "para[%d] : %d \n", i, para[i]);
}
printk(KERN_EMERG "%s\n",str1);
return 0;
}
static void __exit parameter_exit(void)//驱动出口函数
{
printk(KERN_EMERG "parameter_exit\n");
}
module_init(parameter_init);//注册入口函数
module_exit(parameter_exit);//注册出口函数
MODULE_LICENSE("GPL v2");//同意 GPL 开源协议
MODULE_AUTHOR("topeet"); //作者信息
驱动模块传参的命令格式为:insmod 对应的模块 参数。
insmod parameter.ko number=100 name="topeet" para=0,1,2,3,4,5,6,7 str="itop"