传单个参数
头文件在 include/linux/moduleparam.h
内核模块可以通过module_param来传单个参数
– module_param(name,type,perm)
– name:模块参数的名称
– type: 模块参数的数据类型(支持int long short uint ulong ushort类型)
– perm: 模块参数的访问权限(S_IRUSR参数表示所有文件所有者可读)
传递多个参数
module_param_array(name, type, nump, perm)
– name:模块参数的名称
– type: 模块参数的数据类型(支持int long short uint ulong ushort类型)
– nump:保存参数个数的地址,是一个地址
– perm: 模块参数的访问权限(S_IRUSR参数表示所有文件所有者可读)
测试源码:
#include <linux/init.h>
/*包含初始化宏定义的头文件,代码中的module_init和module_exit在此文件中*/
#include <linux/module.h>
/*包含初始化加载模块的头文件,代码中的MODULE_LICENSE在此头文件中*/
/*定义module_param module_param_array的头文件*/
#include <linux/moduleparam.h>
/*定义module_param module_param_array中perm的头文件*/
#include <linux/stat.h>
MODULE_LICENSE("Dual BSD/GPL");
/*声明是开源的,没有内核版本限制*/
MODULE_AUTHOR("SKYFALL");
/*声明作者*/
static int module_arg1,module_arg2;
static int int_array[50];
static int int_num;
module_param(module_arg1,int,S_IRUSR);
module_param(module_arg2,int,S_IRUSR);
module_param_array(int_array,int,&int_num,S_IRUSR);
static int hello_init(void)
{
int i;
printk("%s,%d\n",__func__,__LINE__);
printk(KERN_EMERG "module_arg1 is %d!\n",module_arg1);
printk(KERN_EMERG "module_arg2 is %d!\n",module_arg2);
for(i=0;i<int_num;i++){
printk(KERN_EMERG "int_array[%d] is %d!\n",i,int_array[i]);
}
printk(KERN_EMERG "Hello World enter!\n");
/*打印信息,KERN_EMERG表示紧急信息*/
return 0;
}
static void hello_exit(void)
{
printk("%s,%d\n",__func__,__LINE__);
printk(KERN_EMERG "Hello world exit!\n");
}
module_init(hello_init);
/*初始化函数*/
module_exit(hello_exit);
/*卸载函数*/
编写Makefile,参考以前的博文即可。
加载测试:
insmod module_param.ko module_arg1=10 module_arg2=20 int_array=11,12,13,14,15,16,17,18
cat /sys/module/module_param/parameters/xxx 可以查询参数