内核模块指定参数方式
来源:互联网 发布:ajax跨域get请求数据 编辑:程序博客网 时间:2024/06/06 05:11
内核模块的参数传递方式很多,第一次尝试仅仅介绍了 指定普通类型和数组类型
内核模块指定参数方式
定义内核参数变量
普通变量 : module_param(变量名,变量类型,访问许可掩码)
数组变量 : module_param_array(name, type,&num,perm)
关于数组长度变量num需要说一下,num保存数组的长度变量的地址,方便别的地方调用,而数组的长度由数组初始化的时候指定。
内核支持的模块参数类型
bool 布尔型
invbool 布尔型的反转, 这两种类型和int型关联,即true=0,false=1,反转布尔型是指 装载模块的时候指定0则此变量赋值为false 否则为true
charp 字符指针型,内核会为用户提供的字符串分配内存,并相应的设置指针
int long short 有符号整形变量
uint ulong ushort 无符号整型变量
访问许可掩码,也就是sysfs的访问权限,每一个模块装载后都会在 /sys/module/下保存一个以模块名命名虚拟文件系统
模块名下的/paramters/目录内保存了以变量名命名的文件 访问许可掩码即这些文件的访问权限,看一下下面的介绍
最后的 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 修改, 你的模块看到的参数值也改变了, 但是你的模块没有任何其他的通知. 你应当不要使模块参数可写, 除非你准备好检测这个改变并且因而作出反应
向模块传递参数
普通类型 :
static int howmany=0;static char * whom="world";module_param(howmany,int,S_IRUGO);module_param(whom,charp,S_IRUGO);
insmod param_test.ko howmany=10 whom="Yuanye.Ma"
数组 :
static int len; //存储数组的长度static int buf[]={0,0,0,0,0,0,0,0,0};module_param_array(buf,int, &len, S_IRUGO); //此处是长度的地址
insmod parm_test.ko buf=2,2,2,2 //注意,源代码中定义了九个元素,而此处输入了4个则 len=4
insmod parm_test.ko buf=2,2,2,2 //注意,源代码中定义了九个元素,而此处输入了9个则 len=9
总之,len<=输出初始化的元素个数
实验
实验一:
目标:安装内核模块的时候通过命令行指定整型数 howmany 和 字符串 whom,模块加载进入内核的时候连续输出howmany次 “hello” whom 。
编写源代码
#include <linux/module.h>#include <linux/init.h>static char * whom = "world";static int howmany = 0;module_param(howmany,int,S_IRUGO);module_param(whom,charp,S_IRUGO);static int __init parm_test(void){ int i = 0; for(i=0; i<howmany;i++) { printk(KERN_ALERT"hello %s\n",whom); } return 0;}static void __exit parm_exit(void){ printk(KERN_ALERT"GoodBye Kernel");}module_init(parm_test);module_exit(parm_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("Yuanye.Ma");MODULE_DESCRIPTION("module param test");
编写Makefile
obj-m := parm_test.oKERNEL_PATH = "/usr/src/kernels/2.6.18-8.el5-i686/"PWD = $(shell pwd)all: make -C $(KERNEL_PATH) M=$(PWD) modulesclean: make -C $(KERNEL_PATH) M=$(PWD) clean
内核信息
[root@localhost mod_parm]# modinfo parm_test.ko filename: parm_test.kodescription: module param test //模块描述信息author: Yuanye.Ma //作者名license: GPL //内核版本信息srcversion: F27110872EE977A467DD221depends: vermagic: 2.6.18-8.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1parm: howmany:int //模块参数parm: whom:charp //模块参数
安装并检查结果
[root@localhost mod_parm]# insmod parm_test.ko howmany=10 whom="Yuanye.Ma" //传入参数[root@localhost mod_parm]# dmesg | tail GoodBye Kernel<1>hello Yuanye.Mahello Yuanye.Mahello Yuanye.Mahello Yuanye.Mahello Yuanye.Mahello Yuanye.Mahello Yuanye.Mahello Yuanye.Mahello Yuanye.Mahello Yuanye.Ma
实验二
目标:输入一个数组,在模块内部按顺序输出
编写源码
#include <linux/module.h>#include <linux/init.h>#include <linux/moduleparam.h>static int len;static int buf[]={0,0,0,0,0,0,0,0,0,0};module_param_array(buf,int, &len, S_IRUGO);static int __init parm_test(void){ int i = 0; printk("\nlen = %d\n",len); for(i=0;i<len;i++) printk(KERN_ALERT"%d\n",buf[i]); return 0;}static void __exit parm_exit(void){ printk(KERN_ALERT"GoodBye Kernel");}module_init(parm_test);module_exit(parm_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("Yuanye.Ma");MODULE_DESCRIPTION("module param test");
Makefile 文件内容和实验一相同
查看模块信息
[root@localhost mod_parm]# modinfo parm_test.ko filename: parm_test.kodescription: module param testauthor: Yuanye.Malicense: GPLsrcversion: 83F9FF93EFA9D7495BD1290depends: vermagic: 2.6.18-8.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1parm: buf:array of int //数组参数
装载模块
[root@localhost mod_parm]# insmod parm_test.ko buf=1,2,3,4,5[root@localhost mod_parm]# dmesg | taillen = 512345[root@localhost mod_parm]# rmmod parm_test.c [root@localhost mod_parm]# insmod parm_test.ko buf=1,2,3,4,5,6,7,8,9,0,1 //超过所初始化的元素个数的时候报错insmod: error inserting 'parm_test.ko': -1 Invalid parameters //报错[root@localhost mod_parm]#
实验三:
目标:bool 和 invbool测试
编写源码
#include <linux/module.h>#include <linux/init.h>#include <linux/moduleparam.h>static int boo=0;module_param(boo,bool,S_IRUGO);static int boo1=0;module_param(boo1,invbool,S_IRUGO);static int __init parm_test(void){ printk("\nboo= %d\n",boo); printk("boo1= %d\n",boo1); return 0;}static void __exit parm_exit(void){ printk(KERN_ALERT"GoodBye Kernel");}module_init(parm_test);module_exit(parm_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("Yuanye.Ma");MODULE_DESCRIPTION("module param test");
Makefile 文件内容和实验一实验二都一样此处不再重复
装载模块
[root@localhost mod_parm]# insmod parm_test.ko boo=0 boo1=0[root@localhost mod_parm]# dmesg | tailboo= 0 //boo 为bool变量 赋值为0 所以还是输出0boo1= 1 //boo1 是invbool变量 赋值为0 自动反转为1
- 内核模块指定参数方式
- Linux内核模块:模块参数
- 内核模块 参数
- 内核模块参数使用
- 内核模块参数示例
- linux 内核模块 参数
- linux 内核模块 参数
- 内核模块参数
- linux 内核模块 参数
- linux内核模块参数
- linux内核模块参数
- 内核模块参数
- 内核模块参数设计
- 内核模块参数例子
- 内核模块参数
- 【内核】:模块参数使用示例
- 带参数的内核模块
- Linux内核模块传递参数
- sprinmvc之@requestMapping映射请求通配符
- 常见面试问题
- springmvc之requestMapping(params,headers)
- CSS-Day01-基本语法
- python项目之 天气 优化版
- 内核模块指定参数方式
- 在团队开发中使用 CocoaPods 的小技巧
- jQuery之操作DOM元素
- htmlunit+Jsoup实现网页抓取
- 关于win8系统下的80端口被占用,Apache启动失败.2,MySQL5.1启动失败,请检查相关配置
- Android5.0实现全透明状态栏效果
- 机房重构——初出茅庐,总有险阻
- CSS3 文本特效
- python中利用exec动态创建函数