概述
linux 2.6允许用户insmod的时候往内核模块里面传递参数,它主要使用module_param宏定义来实现这一功能。
参数应用
module_param(name, type, perm);
module_param(参数名,参数类型,参数读写权限)
举例:
static int howmany=1; module_param(howmany, int, 0);
在装载内核模块时,用户可以向模块传递参数,形式为:
insmod/modprobe 模块名 参数名=参数值
如果不传递,参数将使用模块内定义的缺省值。如果模块被内置,就无法insmod了,但bootloader可以通过在bootargs里设置
模块名.参数名=值
给该内置的模块传递参数。
参数类型
参数的类型可以是byte,short,ushort, int, uint, long, ulong, charp, bool或invbool(布尔的反)
除此之外,内核模块还支持参数数组:
module_param_array(数组名,数组类型,数组长,参数读写权限)
insmod时使用逗号分割数组元素。
参数目录
模块被加载后,在/sys/module/目录下将出现以此模块命名的目录。
当读写权限为0时,表示此参数不存在sysfs文件系统下对应的文件节点,如果此模块存在参数读写权限不为0的命令行参数,在此模块的目录下还将出现parameters目录,
其中包含一系列以参数名命名的文件节点,这些文件的权限值就是传入module_param()的参数的读写权限,而文件的内容为参数的值。
示例
// led.c //******************************** #include <linux/module.h> #include <linux/kernel.h> #include <asm/io.h> MODULE_LISENCE("GPL"); MODULE_AUTHOR("limingth"); MODULE_DESCRIPTION("led module driver"); MODULE_VERSION("version1.0"); MODULE_ALIAS("myled test"); static int *vmem; static int led_no = 0; module_param(led_no, int, 0); static __init int led_init(void) { printk("led init ok!n"); vmem = ioremap(0xe0200284, 4); printk("vmem = %pn"); *vmem &= ~(1<<led_no); return 0; } static __exit led_exit(void) { printk("led exit ok!n"); *vmem = 0xf; return ; } module_init(led_init); module_exit(led_exit); //************************************* 应用: insmod led.ko led_no=1 rmmod led
注:在操作系统下,所有的地址均为虚拟地址,所以物理地址需要通过ioremap或mmap函数将物理地址转换为虚拟地址后,再对地址操作。
最后
以上就是呆萌大侠为你收集整理的内核模块module传参的全部内容,希望文章能够帮你解决内核模块module传参所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复