简介
驱动传参定义
在装载内核模块时,用户可以向模块传递参数,形式为
insmode(或modprobe)模块名参数名=参数值
- 如果不传递,参数将使用模块内定义的缺省值。
- 如果模块被内置,就无法
insmod
了,但是bootloader
可以通过在bootargs
里设置“模块名.参数名=值”
的形式给该内置的模块传递参数。
作用
- 设置驱动的相关参数,比如设置缓冲区的大小
- 设置安全校验,防止我们写的驱动被人盗用
传递单个参数
/**
* \brief 注册一个单个的模块参数
*
* 此宏用于向内核注册一个模块参数,使得可以在模块加载时通过命令行传递参数。
*
* \param name 参数名称
* \param type 参数的数据类型,可以是以下之一:
* - int (整型)
* - long (长整型)
* - unsigned int (无符号整型)
* - unsigned long (无符号长整型)
* - bool (布尔型)
* - charp (字符串型)
* \param perm 参数的权限,可以是以下之一:
* - S_IRUSR | S_IWUSR (只允许当前用户读写)
* - S_IRGRP | S_IWGRP (允许同组用户读写)
* - S_IROTH | S_IWOTH (允许其他用户读写)
*
* \note 该宏会自动初始化一个全局变量,并将其与内核参数系统关联起来。
*/
module_param(name, type, perm);
传递数组
/**
* \brief 注册一个数组形式的模块参数
*
* 此宏用于向内核注册一个数组形式的模块参数,使得可以在模块加载时通过命令行传递多个参数。
*
* \param name 数组的名称
* \param type 数组元素的数据类型,可以是以下之一:
* - int (整型)
* - long (长整型)
* - unsigned int (无符号整型)
* - unsigned long (无符号长整型)
* - bool (布尔型)
* - charp (字符串型)
* \param nump 用于存储数组元素数量的变量名称
* \param perm 参数的权限,可以是以下之一:
* - S_IRUSR | S_IWUSR (只允许当前用户读写)
* - S_IRGRP | S_IWGRP (允许同组用户读写)
* - S_IROTH | S_IWOTH (允许其他用户读写)
*
* \note 该宏会自动初始化两个全局变量:一个是数组,另一个是记录数组元素数量的变量。
* 并将它们与内核参数系统关联起来。
*/
module_param_array(name, type, nump, perm);
示例编写
驱动模块传数组
- 完整代码
#include <linux/init.h>
#include <linux/module.h>
//定义数组b
static int b[5];
//定义实际传入进去参数的个数
static int count;
//定义整型变量a
static int a;
//传递普通的参数a,参数权限为S_IRUSR,意为可读
module_param(a, int, S_IRUSR);
//传递数组的参数
module_param_array(b, int, &count, S_IRUSR);
static int hello_init(void)
{
int i;
//循环遍历数组b的值
for (i = 0; i < count; i++)
{
//打印数组b的值
printk("b[%d] = %d \n", i, b[i]);
}
//打印传入参数的个数
printk("count= %d \n", count);
return 0;
}
static void hello_exit(void)
{
printk("goodbye \n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");#include <linux/init.h>
编译驱动
运行测试
- 加载驱动模块
- 每次加载驱动前需确保之前的驱动已经被卸载
rmmod parameter
insmod parameter.ko b=1,2,3,4,5
- 进入
/sys/module/parameter/
目录下,查看b
的权限
cd /sys/module/parameter/
ls
cd parameters/
ls
ls b -l
传入参数大于数组长度时会报错