当前位置: 首页 > Linux kernrl > 正文

[原]内核之旅 — 内核模块学习1—内核模块参数传递

 内核模块的参数传递:

内核模块在加载时是可以添加参数的,但是支持类型有所改变。

首先,内核模块中的变量如果需要使用外界传递的参数需要使用特定的宏

module_param(member,type,perm)

        这三个参数分别表示:

member: 变量名

type : 类型名

perm : 入口项的访问许可源码。

只有使用这个宏才能使我们驱动里边的参数接受到外面的值。

内核支持的模块参数类型有下面几种:

bool :布尔值(取ture 或 false ),关联的变量应该是int型。

invbool: 类型反转其值,也就是说,ture 值变成false , 而false 变成 ture.

charp:字符指针值。内核会为用户提供的字符串分配内存,并相应设置指针。

int ,long , short ,uint ,ulong ,ushort  具有不同长度的基本整数值,以U开头就是无符号值。

也可以接受数组,需要使用宏:

module_param_array(name,type,num,perm);

其中name 就是数组名,type 是数组的元素类型,num 是一个整数变量就是数组元素的个数,越界值直接报错。详情参见moduleparam.h .

       这个文件在源码包/include/linux/moduleparam.h

       我们可以尝试分析一下,追踪一下这个源码:

可以看到这就是数组分配宏的源码,它调用的是

module_param_array_named(name,name,type,nump,perm)

那好,我们再追踪这个宏看看

英语真麻烦。。。。算了还是翻译给大家看看吧。

第一行:重命名数组的参数

@name:一个有效的C表示符作为参数的名字

@array:数组明变量

@type:类型

@nump:数组长度

@perm:文件系统的能见度(俗称权限)

这个操作生成一个不同的名字而不是真正的名字,他要我们查看另一个宏。

param_check_##type(name,&(value));

就是检查这个类型是否有效,“##” 是C中的宏替换运算符,他接受一个名字,和长度。安全检查。
module_param_cd(name,&param_ops_##type,&value,perm)

这个宏调用的是__module_param_call

这个函数在模块中注册一个变量。

回到上边这个宏,我们看到再次确定了变量名与类型的匹配

然后这个数组就算是定义成功,当使用时,内核会让加载器给它分配相应内存。其实这些宏的工作仅仅是检查参数,保存参数。





作者:zmrlinux 发表于2015/9/12 10:32:34 原文链接
阅读:31 评论:0 查看评论
]]>

本文固定链接: http://zmrlinux.com/2015/09/12/%e5%8e%9f%e5%86%85%e6%a0%b8%e4%b9%8b%e6%97%85-%e5%86%85%e6%a0%b8%e6%a8%a1%e5%9d%97%e5%ad%a6%e4%b9%a01-%e5%86%85%e6%a0%b8%e6%a8%a1%e5%9d%97%e5%8f%82%e6%95%b0%e4%bc%a0%e9%80%92/ | Kernel & Me

该日志由 root 于2015年09月12日发表在 Linux kernrl 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: [原]内核之旅 — 内核模块学习1—内核模块参数传递 | Kernel & Me