
Linux系统中,动态加载的模块往往需要实现:
1)在加载模块时,向模块传递一个参数值,且该参数值在模块运行过程中不能对其进行修改;
2)在加载模块时,向模块传递一个参数值,且该参数值在模块运行过程中根据需求对其进行动态修改。
2. 关键过程
1、Linux系统2.6内核下,可以通过宏module_param(name, type, perm)将参数name声明为模块参数,该参数值可以在加载模块时指定,否则为模块内定义的缺省值;
2、我们需要关注perm,perm表示此参数在sysfs文件系统中所对应的文件节点的属性:
1)当perm为0时,表示此参数不存在在sysfs文件系统下对应的文件节点;
2)模块被加载后,在/sys/module/目录下将出现以此模块名命名的目录;
3)如果此模块存在perm不为0的命令行参数,在此模块的目录下将出现parameters目录,包含一系列以参数命名的文件节点;
4)这些文件的权限值等于perm,文件的内容为参数的值。
3、perm有四种不同属性的模块参数:
1)可读写参数:此参数可以实时查看和动态修改其值;其属性为S_IRUGO|S_IWUSR;
2)可读参数:此参数只能实时查看,不能动态修改;其属性为S_IRUGO;
3)可写参数:此参数不能实时查看,但可以动态修改;其属性为S_IWUSR;
4)不可读写参数:此参数不能在sysfs文件系统中显示,也不能实时查看和动态修改其值;其属性值为0;
很多情况下,我们期望通过参数来控制我们的驱动的行为,比如由于系统的不同,而为了保证我们驱动有较好的移植性,我们有时候期望通过传递参数来控制我们驱动的行为,这样不同的系统中,驱动可能有不同的行为控制。
为了满足这种需求,内核允许对驱动程序指定参数,而这些参数可在加载驱动的过程中动态的改变
参数的来源主要有两个
使用insmod/modprobe ./xxx.ko时候在命令行后直接给出参数;
modprobe命令装载模块时可以从它的配置文件/etc/modprobe.conf文件中读取参数值
这个宏必须放在任何函数之外,通常实在源文件的头部
模块参数传递的方式
对于如何向模块传递参数,Linux kernel 提供了一个简单的框架。其允许驱动程序声明参数,并且用户在系统启动或模块装载时为参数指定相应值,在驱动程序里,参数的用法如同全局变量。
使用下面的宏时需要包含头文件<linux/moduleparam.h>
宏
module_param(name, type, perm)module_param_array(name, type, num_point, perm)module_param_named(name_out, name_in, type, perm)module_param_string(name, string, len, perm)MODULE_PARM_DESC(name, describe)
1: 查看已加载模块使用lsmod命令可以进行查看.2: modinfo功能说明:显示kernel模块的信息。语法:modinfo [-0] [-F field] [modulename|filename ...]
modinfo -Vmodinfo -h补充说明:modinfo会显示kernel模块的对象文件,以显示该模块的相关信息。
参数:-F field 只打印指定的区域的信息。
-a 显示模块作者名称。
-d 显示模块的说明。
-l 显示模块的授权。
-n 显示模块的详细路径及名称。
-p 显示模块所支持的参数。
-h 显示帮助信息。
-V或--version 显示版本信息。
详细参考帮助信息。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)