6.模块的参数
更多内容请参考Linux设备驱动程序学习----目录
模块参数
由于系统不同,驱动程序需要的参数也许会变化,包括设备编号、控制参数等。为满足这些需求,内核允许对驱动程序指定参数,而这些参数可在装载驱动程序模块时改变。这些参数的值可以在运行insmod或modprob命令装载模块时赋值,而modprobe命令还可以从它的配置文件(/etc/modprob.conf)中读取参数值。
例如:在前面“Hello world”模块的基础上进行扩展,添加两个参数:一个整数值howmany;另一个字符串whom;将向whom问候howmany次。可以使用命令:
insmod hellop.ko howmany=10 whom="Mom"
驱动程序的实现方式中,参数必须使用module_param()宏来声明,该宏需要三个参数:变量的名称、类型、及访问许可掩码,该宏必须放在驱动任何函数之外,通常在源文件的头部。
#include <moduleparam.h>
static char *whom = "world";
static int howmany = 1;
module_param(howmany, int, S_IRUGO);
module_param(whom, charp, S_IRUGO);
内核支持的模块参数类型如下:
bool
invbool
布尔值(取true或false),关联变量应该是int型。invbool类型反转其值,即true变成false,而false变成true。
charp
字符指针值。内核会为用户提供的字符串分配内存,并设置指针。
int
long
short
uint
ulong
ushort
具有不同长度的基本整数值。以u开头的类型用于无符号值。
对于数组参数,在提供数组值时用逗号划分各数组成员。用以下宏:
module_param_array(name, type, num, perm);
name: 数组名称,即参数名称;
type: 数组元素的类型;
num: 是一个整型变量;
perm: 是常见的访问许可值;
模块装载器会拒绝接受超过数组大小的值。所有的模块参数都应该给定一个默认值,insmod命令只会在用户明确设置了参数的值的情况下才会改变参数的值。模块可以根据默认值来判断是否是一个显式指定的参数。
module_param()宏中的最后一个成员是访问许可值,这些宏定义在<linux/stat.h>中定义,该值用来控制谁能够访问sysfs中对模块参数的表述。如果perm=0,就不会有对应的sysfs入口项;否则,模块参数会在/sys/module中出现,并设置为给定的访问许可。
perm:
S_IRUGO : 任何人都可以读取该值,但不能修改;
S_IRUGO | S_IWUSR : 允许root用户修改该参数;
注意:如果一个参数通过sysfs而被修改,则如同模块修改了这个参数值一样,但是内核不会以任何方式通知模块。多数情况下,我们不应该让模块参数是可写的,除非打算检测这中修改并作出相应的改动。
带参数的模块驱动程序如下所示:
#include <linux/init.h>
#include <linux/module.h>
static char *whom = "world";
static int howmany = 1;
module_param(whom, charp, S_IRUGO);
module_param(howmany, int, S_IRUGO);
static int __init hello_init(void)
{
int i = 0;
printk(KERN_ALERT "Hello, world\n");
printk(KERN_INFO "whom: %s, howmany: %d\n", whom, howmany);
for (i = 0; i < howmany; i++) {
printk(KERN_INFO "i= %d, whom: %s\n", whom);
}
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");
默认加载模块运行如下:
# insmod my_module.ko
Hello, world
whom: world, howmany: 1
i = 0, whom: world
修改参数值加载模块运行如下:
# insmod my_module.ko whom="Hello world, so happy!" howmany=3
Hello, world
whom: Hello, howmany: 3
i = 0, whom: Hello
i = 1, whom: Hello
i = 2, whom: Hello
更多内容请参考Linux设备驱动程序学习----目录