简介
在加载模块时可以通过加载命令行向模块传递参数,内核支持的模块参数类型有: ‘bool’、 ‘invbool’、‘charp’、‘short’、‘int’、‘long’、‘ushort’、‘uint’、‘ulong’。
声明模块参数
通过宏定义’module_param(name, type, perm)'可以将一个变量声明为模块参数
通过宏定义’module_param_array(name,type, nump, perm)'可以将一个数组声明为模块参数
向模块传递参数
提供在加载命令命令的后面列出模块参数列表及其值即可,如 insmod module_param.ko baud=115200 name=“test”;对于普通变量采用"参数名=值"的方式列出,如 baud=115200;对于数组变量采用 ”参数名=元素1,元素2,元素3,…“的方式列出,如 port=1,2,3,4;若一个模块有多个参数需要传递,参数列表之间用空格隔开,如 baud=115200 name=“test module” port=1,2,3,4
代码说明
如下是一个使用了模块参数的内核模块源代码
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
//定义变量,并赋初值
static unsigned int baud = 115200;
static int port[4] = {0,1,2,3};
static char *name = "module param test";
//声明模块参数
/**
* name 参数名称
* type 变量类型,内核支持 bool invbool charp short int long ushort uint ulong
* perm 在/sys/module/xxx/parameters/下生成的文件的权限,可以采用8进制格式表示
*/
module_param(baud, uint, S_IRUGO);
module_param(name, charp, S_IRUGO);
/**
* name 参数名称
* type 变量类型,内核支持 bool invbool charp short int long ushort uint ulong
* nump 指向存数组元素个数的变量,可以为NULL
* perm 在/sys/module/xxx/parameters/下生成的文件的权限,可以采用8进制格式表示
*/
module_param_array(port, int, NULL, S_IRUGO);
//模块加载函数
static int __init driver_init(void)
{
int i;
printk("module init\r\n");
//输出参数的值
printk("baud = %d\r\n", baud);
for(i=0; i<4; i++)
printk("port[%d] = %d\t", i, port[i]);
printk("\r\n");
printk("name = %s\r\n", name);
return 0;
}
//模块卸载函数
static void __exit driver_exit(void)
{
printk("module exit\r\n");
}
module_init(driver_init);
module_exit(driver_exit);
MODULE_LICENSE("GPL");
//模块作者信息
MODULE_AUTHOR("csdn");
//模块描述
MODULE_DESCRIPTION("module parameter test");
实验
- 从“https://gitcode.net/lf282481431/linux_driver_demo/-/tree/master/01-kernel_module/03-module_param”下载代码,并进行编译,然后拷贝到目标板的root目录中
- 执行命令 insmod module_param.ko port=5,6,7 name=“module_test_module” baud=115200 加载模块,这里向模块参数传递了相应的值,在执行加载函数是会将传递到模块参数的值输出