购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

4.5
模块参数

我们可以用“module_param(参数名,参数类型,参数读/写权限)”为模块定义一个参数,例如下列代码定义了1个整型参数和1个字符指针参数:

static char *book_name = "dissecting Linux Device Driver";
module_param(book_name, charp, S_IRUGO);

static int book_num = 4000;
module_param(book_num, int, S_IRUGO);

在装载内核模块时,用户可以向模块传递参数,形式为“insmod(或modprobe)模块名参数名=参数值”,如果不传递,参数将使用模块内定义的缺省值。如果模块被内置,就无法insmod了,但是bootloader可以通过在bootargs里设置“模块名.参数名=值”的形式给该内置的模块传递参数。

参数类型可以是byte、short、ushort、int、uint、long、ulong、charp(字符指针)、bool或invbool(布尔的反),在模块被编译时会将module_param中声明的类型与变量定义的类型进行比较,判断是否一致。

除此之外,模块也可以拥有参数数组,形式为“module_param_array(数组名,数组类型,数组长,参数读/写权限)”。

模块被加载后,在/sys/module/目录下将出现以此模块名命名的目录。当“参数读/写权限”为0时,表示此参数不存在sysfs文件系统下对应的文件节点,如果此模块存在“参数读/写权限”不为0的命令行参数,在此模块的目录下还将出现parameters目录,其中包含一系列以参数名命名的文件节点,这些文件的权限值就是传入module_param()的“参数读/写权限”,而文件的内容为参数的值。

运行insmod或modprobe命令时,应使用逗号分隔输入的数组元素。

现在我们定义一个包含两个参数的模块(如代码清单4.4,位于本书配套源代码/kernel/drivers/param目录下),并观察模块加载时被传递参数和不传递参数时的输出。

代码清单4.4 带参数的内核模块

 1#include <linux/init.h>
 2#include <linux/module.h>
 3
 4static char *book_name = "dissecting Linux Device Driver";
 5module_param(book_name, charp, S_IRUGO);
 6
 7static int book_num = 4000;
 8module_param(book_num, int, S_IRUGO);
 9
10static int __init book_init(void)
11{
12  printk(KERN_INFO "book name:%s\n", book_name);
13  printk(KERN_INFO "book num:%d\n", book_num);
14  return 0;
15}
16module_init(book_init);
17
18static void __exit book_exit(void)
19{
20  printk(KERN_INFO "book module exit\n ");
21}
22module_exit(book_exit);
23
24MODULE_AUTHOR("Barry Song <baohua@kernel.org>");
25MODULE_LICENSE("GPL v2");
26MODULE_DESCRIPTION("A simple Module for testing module params");
27MODULE_VERSION("V1.0");

对上述模块运行“insmod book.ko”命令加载,相应输出都为模块内的默认值,通过查看“/var/log/messages”日志文件可以看到内核的输出:

# tail -n 2 /var/log/messages
Jul 2 01:03:10 localhost kernel: <6> book name:dissecting Linux Device Driver
Jul 2 01:03:10 localhost kernel: book num:4000

当用户运行“insmod book.ko book_name='GoodBook'book_num=5000”命令时,输出的是用户传递的参数:

# tail -n 2 /var/log/messages
Jul 2 01:06:21 localhost kernel: <6> book name:GoodBook
Jul 2 01:06:21 localhost kernel: book num:5000

另外,在/sys目录下,也可以看到book模块的参数:

barry@barry-VirtualBox:/sys/module/book/parameters$ tree
.
├── book_name
└── book_num

并且我们可以通过“cat book_name”和“cat book_num”查看它们的值。 cQ8ObakW/QYZnhdz9Yn7uJQBEoN41wNAtlIY2VpBfywXISng2dnlOV7y7Vdo+Cbo

点击中间区域
呼出菜单
上一章
目录
下一章
×