LDD3_NO.6:Module Parameters

来源:互联网 发布:台湾bgo有假货吗 知乎 编辑:程序博客网 时间:2024/04/27 19:03

  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只在用户明确告知它的时候来回改变。modul
e_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.