- 对于如何向内核模块传递参数,Linux kernel 提供了一个简单的框架。其允许驱动程序声明参数,并且用户在系统启动或模块装载时为参数指定相应值,在驱动程序里,参数的用法如同全局变量。使用下面的宏时需要包含头文件<linux/moduleparam.h>。 在实际使用时,可以通过宏module_param()定义一个模块参数:
-
其中参数解释如下:module_param(name, type, perm);
name:既是用户看到的参数名,又是模块内接受参数的变量;
type:表示参数的数据类型,是下列之一:byte, short, ushort, int, uint, long, ulong, charp(字符指针), bool, invbool(布尔的反);
perm:指定了在sysfs中相应文件的访问权限。访问权限与linux文件访问权限相同的方式管理,如0644,或使用stat.h中的宏如S_IRUGO表示。0表示完全关闭在sysfs中相对应的项。
这些宏不会声明变量,因此在使用宏之前,必须声明变量。典型地用法如下:
static unsigned int int_var = 0; module_param(int_var, uint, S_IRUGO);
这些必须写在模块源文件的开头部分,即int_var是全局的。也可以使模块源文件内部的变量名与外部的参数名有不同的名字,通过module_param_named()定义:
module_param_named(name, variable, type, perm);
其中name是外部可见的参数名,variable是源文件内部的全局变量名。module_param就是通过module_param_named实现,只不过name与variable相同。例如:
static unsigned int max_test = 9; module_param_name(maximum_line_test, max_test, int, 0);
代码示例如下: -
#include <linux/module.h> #include <linux/init.h> MODULE_LICENSE("GPL"); static char *name ="feifei"; static int age=30; module_param(age,int,S_IRUGO); module_param(name,charp,S_IRUGO); static int __init hello_init(){ printk(KERN_EMERG "Name:%s\n",name); printk(KERN_EMERG "Age:%d\n",age); return 0; } static void __exit hello_exit(void){ printk(KERN_EMERG "Module exit\n"); } module_init(hello_init); module_exit(hello_exit); /*注释 moudle_param 宏定义来声明name,age 参数可用 module_param 使用了 3 个参数: 变量名, 它的类型, 以及一个权限掩码用来做一个辅助的 sysfs 入口. 这个宏定义应当放在任何函数之外, 典型地是出现在源文件的前面 模块参数支持的类型: bool 一个布尔型( true 或者 false)值(相关的变量应当是 int 类型). invbool: invbool 类型颠倒了值, 所以真值变成 false, 反之亦然. charp 一个字符指针值. 内存为用户提供的字串分配, 指针因此设置. int long short uint ulong ushort 数组参数: 用逗号间隔的列表提供的值, 模块加载者也支持. 声明一个数组参数, 使用: module_param_array(name,type,num,perm); 这里 name 是你的数组的名子(也是参数名), type 是数组元素的类型, num 是一个整型变量, perm 是通常的权限值. 如果数组参数在加载时设置, num 被设置成提供的数的个数. 模块加载者拒绝比数组能放下的多的值. S_IRUGO:权限值 使用 S_IRUGO 作为参数可以被所有人读取, 但是不能改变; S_IRUGO|S_IWUSR 允许 root 来改变参数 你应当不要使模块参数可写, 除非你准备好检测这个改变并且因而作出反应 */
- Makefile内容如下:
-
ifneq ($(KERNELRELEASE),) obj-m :=param.o else KDIR:= /lib/modules/2.6.29/build all: make -C $(KDIR) M=$(PWD) modules clean: rm -f *.ko *.o *.mod.o *.mod.c .symvers endif
如下是加载模块的操作 - [root@bogon 4-1-3]# insmod param.ko
- Message from syslogd@ at Wed Jun 15 22:06:41 2011 ...
- bogon kernel: Name:feifei
- Message from syslogd@ at Wed Jun 15 22:06:41 2011 ...
- bogon kernel: Age:30
-
- [root@bogon 4-1-3]# insmod param.ko name="zhang" age=10
- Message from syslogd@ at Wed Jun 15 22:08:57 2011 ...
- bogon kernel: Name:zhang
- Message from syslogd@ at Wed Jun 15 22:08:57 2011 ...
- bogon kernel: Age:10
linux内核模块参数
最新推荐文章于 2024-06-24 00:13:44 发布