简介

驱动传参定义

在装载内核模块时,用户可以向模块传递参数,形式为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

传入参数大于数组长度时会报错