8. Module Parameters
模块参数
有些参数因系统而异,从设备号到设备操作各个方面。比如,SCSI适配器通常有控制标记命令队列的使用。参数值可以在insmod或modprobe加载模块时指定,modprobe也可以从配置文件/etc/modprobe.conf中读取参数的值。这些命令接受不同类型的值。在hello,world模块中,我们增加两个参数:一个整型howmany,一个字符串whom。模块增加了一些功能,在加载的时刻,欢迎whom不止一次,而是howmany次。这个模块可以这样加载:
根据这样加载,hello会说“Hello,Mom”10次。
不过在insmod修改模块参数之前,模块要使这些参数可用。参数使用module_param宏声明,这个宏定义在linux/moduleparam.h中。module_param有三个参数:变量名、类型和权限掩码(用做sysfs入口的辅助)。宏应该在任何函数之前申明。
模块参数支持很多类型:
bool
invboo
布尔型的值是true或false(对应为int类型),而invbool类型刚好相反。
charp
字符指针,内存为用户的字符串分配的。
int
long
short
uint
ulong
ushort
数组参数,使用逗号间隔列表,申明数组参数如下:
module_param_array(name,type,num,perm);
name是数组也是参数的名字,type是指数组元素的类型,num是一个整型变量,perm是通常的权限值。如果数组参数在加载时设置,num被设置成元素的个数。
若需要上面没有提及的类型,在模块代码中可以使用钩子来定义。
所有的模块参数应该有一个缺省值,insmod只在用户明确告知它的时候来回改变。module_param的最后一个参数是一个权限值,只能使用<linux/stat.h>中定义的值。
在hello.c中更改部分代码:
make
在hello.c中,arrayNum貌似没有作用,如果修改:
static int intArray[]={1,2,3,4,5,6};
static int arrayNum = 4;
执行:
insmod hello.ko intArray=5,6,7,7,9,10
成功,虽然arrayNum=4.