模块参数允许用户在加载模块时通过命令行指定参数值,在模块的加载过程中,加载程序会得到命令行参数,并转换为相应类型的值,然后赋值给对应的变量,这个过程发生在调用模块初始化函数之前。内核支持的参数类型有:bool、invbool(反转值bool类型)、charp(字符串指针)、short、int、long、ushort、uint、ulong。这些类型又可以复合成对应的数组类型。
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
static int baudrate = 9600;
static int port[4] = {0,1,2,3};
static char *name = "vser";
module_param(baudrate, int , S_IRUGO);
module_param_array(port, int , NULL ,S_IRUGO);
module_param(name , charp , S_IRUGO);
static int __init vser_init(void)
{
int i;
printk("vser_init\n");
printk("baudrate: %d\n", baudrate);
printk("port: ");
for(i=0; i < ARRAY_SIZE(port); i++)
printk("%d ",port[i]);
printk("\n");
printk("name: %s\n",name);
return 0;
}
static void __exit vser_exit(void)
{
printk("vser_exit\n");
}
module_init(vser_init);
module_exit(vser_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("huang yun biao < huangyb@3102972794@qq.com.cn>");
MODULE_ALIAS("virtual-serial");
module_param(name, type, perm)
module_param_array(name, type, nump, perm)
name:变量的名字
type:变量或数组元素的类型
nump:数组元素个数的指针,可选
perm:文件系统中对应文件的权限属性,所有用户组可读权限:S_IRUGO
编译、安装模块后,在加载模块时,如果不指定模块参数的值,那么使用的命令和内核打印的信息如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210131163013745.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h5YmN0,size_16,color_FFFFFF,t_70)
可见打印的值都是代码中的默认值,如果需要制定模块参数的值,可以使用下面的命令
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210131163143186.png)
通过命令行参数的形式,对默认值进行修改
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021013116324037.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2h5YmN0,size_16,color_FFFFFF,t_70)
参考sys文件系统下的内容,可以发现和模块参数对应的文件及相对应的权限
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210131163744798.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210131163836804.png)
虽然在代码中增加模块参数的写权限可以使用户通过sysfs文件系统来修改模块参数的值,但并不推荐这样做。因为通过这种方式对模块参数进行的修改模块本身是一无所知的。