module_param()的学习
一.module_param
1.为什么引入
在用户态下编程可以通过main()来传递命令行参数,而编写一个内核模块则可通过module_param()来传递命令行参数.
2. module_param宏是Linux 2.6内核中新增的,该宏被定义在include/linux/moduleparam.h文件中,具体定义如下:
/* Helper functions: type is byte, short, ushort, int, uint, long,
ulong, charp, bool or invbool, or XXX if you define param_get_XXX,
param_set_XXX and param_check_XXX.
*/
#define module_param_named(name, value, type, perm)
param_check_##type(name, &(value));
module_param_call(name, param_set_##type, param_get_##type, &value, perm);
__MODULE_PARM_TYPE(name, #type)
#define module_param(name, type, perm)
module_param_named(name, name, type, perm)
由此可知 module_param的实现是通过module_param_named(name, name, type, perm)的。
3.module_param使用了3个参数:变量名,它的类型,以及一个权限掩码用来做一个辅助的sysfs入口。
这个宏定义应当放在任何函数之外,典型地是出现在源文件的前面。
eg: static char *whom="world"
static int tige=1;
module_param(tiger,int,S_IRUGO);
module_param(whom,charp,S_IRUGO);
4.模块参数支持许多类型:
bool
invbool
一个布尔型( true 或者 false)值(相关的变量应当是 int 类型). invbool 类型颠倒了值, 所以真值变成 false, 反之亦然.
charp :一个字符指针值. 内存为用户提供的字串分配, 指针因此设置.
int
long
short
uint
ulong
ushort
基本的变长整型值. 以 u 开头的是无符号值.
5.数组参数, 用逗号间隔的列表提供的值, 模块加载者也支持。
声明一个数组参数, 使用:
module_param_array(name,type,num,perm);
这里 name 是你的数组的名子(也是参数名),
type 是数组元素的类型,
num 是一个整型变量,
perm 是通常的权限值.
如果数组参数在加载时设置, num 被设置成提供的数的个数. 模块加载者拒绝比数组能放下的多的值.
Tiger-John说明:
perm参数的作用是什么?
最后的 module_param 字段是一个权限值,表示此参数在sysfs文件系统中所对应的文件节点的属性。你应当使用 <linux/stat.h> 中定义的值. 这个值控制谁可以存取这些模块参数在 sysfs 中的表示.当perm为0时,表示此参数不存在 sysfs文件系统下对应的文件节点。 否则, 模块被加载后,在/sys/module/ 目录下将出现以此模块名命名的目录, 带有给定的权限.。
权限在include/linux/stat.h中有定义
比如:
#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
使用 S_IRUGO 参数可以被所有人读取, 但是不能改变; S_IRUGO|S_IWUSR 允许 root 来改变参数. 注意, 如果一个参数被 sysfs 修改, 你的模块看到的参数值也改变了, 但是你的模块没有任何其他的通知. 你应当不要使模块参数可写, 除非你准备好检测这个改变并且因而作出反应.
二实例:
说了这么多,看一个程序体验以下:
1.module_param.c
2.编写Makefile文件
3.在终端输入:make
4 .加载模块: sudo insmdo module_param.ko who=tiger times=4
5.dmesg :查看结果。
过程实例:
a.在终端输入:make
think@ubuntu:~/module_param$ make
make -C /usr/src/linux-headers-2.6.32-25-generic M=/home/think/module_param modules
make[1]: 正在进入目录 `/usr/src/linux-headers-2.6.32-25-generic'
Building modules, stage 2.
MODPOST 1 modules
make[1]:正在离开目录 `/usr/src/linux-headers-2.6.32-25-generic'
think@ubuntu:~/module_param$
b.在终端输入: sudo insmod module_param.ko who=tiger times=4
think@ubuntu:~/module_param$ sudo insmod module_param.ko who=tiger times=4
c 在终端输入:dmesg
[ 4297.711137] 1 tiger!
[ 4297.711139] 2 tiger!
[ 4297.711140] 3 tiger!
[ 4297.711141] 4 tiger!
分享到:
相关推荐
module_param内核函数的意思
module_param使用测试完整例程(含Makefile),更多详情,见文章: https://dingdong.blog.csdn.net/article/details/106355202
于是需要首先读出当前的事务的状态,再进行修改,此时便可以使用到web_reg_save_param了。可以通过它先将事务的状态读出写入一个自定义的变量中,根据变量的值来决定下一步的动作。 简要说明 语法:intweb_reg_...
这是我在使用LoadRunner过程中总结的,上传上来供需要的人使用,希望能对你有所帮助,(*^__^*) 嘻嘻…… 坚决支持资源共享
DV_vs_HDR10_PARAM.pdf
assert_param-转载
param set linux_cmd_line "console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.100:/opt/rootfs_qtopia_qt4 ip=192.168.1.101:192.168.1.100:192.168.1.111:255.255.255.0:sbc2440.arm9.net:eth0:off
本文是关于assert_param的疑惑。
结构体struct module在内核中代表一个内核模块,通过insmod(实际执行init_module系统调用)把自己编写的内核模块插入内核时,模块便与一个struct module结构体相关联,并成为内核的一... struct module_param_attrs *
我这个实验除了对参数的改变进行实验外,我的一个重要的目的是测试“ module_param_array(TNparam , int , &TNparam_nr , S_IRUGO);”中&TNparam_nr对输入参数数目的限制作用。经过我的实验,表明&TNparam_nr并没有...
STM32中assert_param的使用,综合网上多种说法,看完不一样的感觉。
曲波变换程序代码,实现图像的曲波分解以及显示,可以去图像进行曲波去噪增强,对彩色图像空间模型转化后提取曲波信息
主要介绍了php中bind_param()函数用法,简单分析了bind_param()函数的功能、参数、使用方法与相关注意事项,需要的朋友可以参考下
自然语言转SQL任务 https://github.com/guotong1988/NL2SQL-RULE 用的数据
NULL 博文链接:https://lindows.iteye.com/blog/1273992
S2P模型参数稳定性评估计算器,方便稳定性设计
9_display_param.cfg
6_display_param.cfg