linux内核模块的参数传递

模块安装时候可以给模块中的变量传递数值,安装后,模块中变量的值就是安装时所传入的值 ,没有传递的变量,则使用代码中默认值。

带参数的模块安装后会生成目录:

/sys/module/模块名/parameters/

示例:如果安装 了名字为 hello_model_param 的模块,则会生成

/sys/module/hello_model_param/parameters/

这个文件夹下会生成以参数为名字文件,其内容就是参数的值。可以使用cat 或echo操作这个文件,修改变量的值,但是一般情况下都不建议修改,所以这个权限的值一般设置只读的。

模块中如果变量要通过安装时传参数覆盖默认值,则需要使用以下宏修饰:

module_param,module_param_array

说明:
对于非数组类型变量使用module_param,语法:
module_param(变量名,变量类型,变量的访问权限) //变量的访问权限:变量会文件系统以一个文件形式呈现,这个文件权限属性就是“变量的访问权限”
变量传递参数:insmod xx.ko 变量名=值

对于数组类型变量使用 module_param_array , 语法:
module_param_array(数组名,数组元素类型,&num,变量的访问权限) //num 是一个 char ,int,long 或uchar,uint,ulong类型的变量,用于保存传递给数组的元素个数。

数组传递参数: insmod xx.ko 数组名=元素0,元素1,元素2, ……

基本类型有:

bool   :布尔类型
invbool:颠倒了值的bool类型;
charp  :字符指针类型,内存为用户提供的字符串分配;(char *)
int    :整型
long   :长整型
short  :短整型
uint   :无符号整型(unsigned int)
ulong  :无符号长整型(unsigned long)
ushort :无符号短整型(unsigned short)

指针类只能char*,对应名字 charp .

访问权限:
modlue_param 和 module_param_array 中的 perm 用于设定该参数的访问权限;
perm 表示该参数在 sysfs 文件系统中所对应的文件节点的属性;你用该使用中定义的权限值;这
个值控制谁可以存取这些模块参数在 sysfs 文件系统中的表示;当 perm 为 0 时,表示此参数不存在 sysfs 文件
系统下对应的文件节点;否则,模块被加载后,会出现 /sys/module/模块名/parameters/参数名 这类文件 ,带
有给定的权限;

比如:
#define S_IRWXU 00700
#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100
#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010
#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002

#define S_IXOTH 00001
注意:如果一个参数被 sysfs 修改了,那么你的模块看到的参数值也被修改了,但是你的模块不会收到任何通知;
你应当不要使模块参数可写,除非你准备好检测这个改变并因而作出反应;

你可能感兴趣的:(linux内核,linux,算法,运维)