module_param()

在用户态下编程可以通过main()来传递命令行参数,而编写一个内核模块则可通过module_param()来传递命令行参数.

module_param宏是Linux 2.6内核中新增的,该宏被定义在include/linux/moduleparam.h文件中,具体定义如下:

 #define module_param(name, type, perm)                          \        module_param_named(name, name, type, perm) 
  
 
  

#define module_param_named(name, value, type, perm)                        \

        param_check_##type(name, &(value));                                \
        module_param_cb(name, ¶m_ops_##type, &value, perm);            \
        __MODULE_PARM_TYPE(name, #type)


#define module_param_cb(name, ops, arg, perm)                                 \
        __module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, -1)


由此可知 module_param的实现是通过module_param_named(name, name, type, perm)的。 
module_param使用了3个参数:变量名,它的类型,以及一个权限掩码用来做一个辅助的sysfs入口。 
这个宏定义应当放在任何函数之外,典型地是出现在源文件的前面。
eg: static char *whom="world"
    static int    tige=1;
    module_param(tiger,int,S_IRUGO);
    module_param(whom,charp,S_IRUGO); 


内核文件权限掩码定义在/src/include/stat.h中:

   5#include 
   6#include 
   7
   8#define S_IRWXUGO       (S_IRWXU|S_IRWXG|S_IRWXO)
   9#define S_IALLUGO       (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
  10#define S_IRUGO         (S_IRUSR|S_IRGRP|S_IROTH)
  11#define S_IWUGO         (S_IWUSR|S_IWGRP|S_IWOTH)
  12#define S_IXUGO         (S_IXUSR|S_IXGRP|S_IXOTH)
  13

  26
  27#define S_IRWXU 00700
  28#define S_IRUSR 00400
  29#define S_IWUSR 00200
  30#define S_IXUSR 00100
  31
  32#define S_IRWXG 00070
  33#define S_IRGRP 00040
  34#define S_IWGRP 00020
  35#define S_IXGRP 00010
  36
  37#define S_IRWXO 00007
  38#define S_IROTH 00004
  39#define S_IWOTH 00002
  40#define S_IXOTH 00001
 
  
 
  
S_IRUSR:用户读  00400
S_IRGRP:用户组读 00040
S_IROTH: 其他读 00004
可传入0表示采用系统默认值
模块参数支持许多类型: 
bool
invbool
一个布尔型( true 或者 false)值(相关的变量应当是 int 类型). invbool 类型颠倒了值, 所以真值变成 false, 反之亦然.
charp :一个字符指针值. 内存为用户提供的字串分配, 指针因此设置.
int
long
short
uint
ulong
ushort
基本的变长整型值. 以 u 开头的是无符号值. 

perm参数的作用是什么?
最后的 module_param 字段是一个权限值; 你应当使用 中定义的值. 这个值控制谁可以存取这些模块参数在 sysfs 中的表示.如果 perm 被设为 0, 就根本没有 sysfs 项. 否则, 它出现在 /sys/module下面, 带有给定的权限. 使用 S_IRUGO 作为参数可以被所有人读取, 但是不能改变; S_IRUGO|S_IWUSR 允许 ro搜索ot 来改变参数. 注意, 如果一个参数被 sysfs 修改, 你的模块看到的参数值也改变了, 但是你的模块没有任何其他的通知. 你应当不要使模块参数可写, 除非你准备好检测这个改变并且因而作出反应.

你可能感兴趣的:(module_param())