如何在加载模块时向模块传递参数值

1. 现象描述

Linux系统中,动态加载的模块往往需要实现:

1)在加载模块时,向模块传递一个参数值,且该参数值在模块运行过程中不能对其进行修改;

2)在加载模块时,向模块传递一个参数值,且该参数值在模块运行过程中根据需求对其进行动态修改。

2. 关键过程

1Linux系统2.6内核下,可以通过宏module_param(name, type, perm)将参数name声明为模块参数,该参数值可以在加载模块时指定,否则为模块内定义的缺省值;

2、我们需要关注permperm表示此参数在sysfs文件系统中所对应的文件节点的属性:

1)当perm0时,表示此参数不存在在sysfs文件系统下对应的文件节点;

2)模块被加载后,在/sys/module/目录下将出现以此模块名命名的目录;

3)如果此模块存在perm不为0的命令行参数,在此模块的目录下将出现parameters目录,包含一系列以参数命名的文件节点;

4)这些文件的权限值等于perm,文件的内容为参数的值。

3perm有四种不同属性的模块参数:

1)可读写参数:此参数可以实时查看和动态修改其值;其属性为S_IRUGO|S_IWUSR

2)可读参数:此参数只能实时查看,不能动态修改;其属性为S_IRUGO

3)可写参数:此参数不能实时查看,但可以动态修改;其属性为S_IWUSR

4)不可读写参数:此参数不能在sysfs文件系统中显示,也不能实时查看和动态修改其值;其属性值为0

由此我们可以通过设置不同的perm值,实现不同参数不同的控制。

3. 案例实现

3.1. Demo说明

1demo程序定义了2各模块参数,分别为uidperiod。加载模块时,可以向模块传递这两个参数的值,否则这两个参数值将为默认值;模块运行过程中,两者均可被用户、用户所在组及其他组读取,后者还可被用户修改。

2demo程序使用到的perm权限值含义:

S_IRUGOS_IRUSR|S_IRGRP|S_IROTH,表示可以被用户、用户所在组及其他组读取且只读;

S_IWUSR:表示可以被用户(能动态加载模块的用户必须是超级用户)修改。

3demo程序根据uidperiod打印不同的信息;当period值变化时,会再次打印信息。

4demo程序使用说明如下:

1)加载模块时:insmod demo.ko uid=0 period =0

2)模块运行过程中,读取uid值:cat /sys/module/demo/parameters/uid

3) 模块运行过程中,修改period值:echo 1 > /sys/module/demo/parameters/period

3.2. 源文件

 

 

4. 经验总结

1、根据对不同用户权限要求设置perm位;

2、对于只需在加载模块时传递参数值、而不希望用户看到该参数,建议将perm位置为0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值