linux内核模块参数

  1.     对于如何向内核模块传递参数,Linux kernel 提供了一个简单的框架。其允许驱动程序声明参数,并且用户在系统启动或模块装载时为参数指定相应值,在驱动程序里,参数的用法如同全局变量。使用下面的宏时需要包含头文件<linux/moduleparam.h>。 在实际使用时,可以通过宏module_param()定义一个模块参数:
  2. module_param(name, type, perm);
    其中参数解释如下:
        name:既是用户看到的参数名,又是模块内接受参数的变量;
        type:表示参数的数据类型,是下列之一:byte, short, ushort, int, uint, long, ulong, charp(字符指针), bool, invbool(布尔的反);
        perm:指定了在sysfs中相应文件的访问权限。访问权限与linux文件访问权限相同的方式管理,如0644,或使用stat.h中的宏如S_IRUGO表示。0表示完全关闭在sysfs中相对应的项。
    这些宏不会声明变量,因此在使用宏之前,必须声明变量。典型地用法如下:
    static unsigned int int_var = 0; 
    module_param(int_var, uint, S_IRUGO);

        这些必须写在模块源文件的开头部分,即int_var是全局的。也可以使模块源文件内部的变量名与外部的参数名有不同的名字,通过module_param_named()定义:
    module_param_named(name, variable, type, perm);

        其中name是外部可见的参数名,variable是源文件内部的全局变量名。module_param就是通过module_param_named实现,只不过name与variable相同。例如:
    static unsigned int max_test = 9;
    module_param_name(maximum_line_test, max_test, int, 0);

    代码示例如下:
  3. #include <linux/module.h>
    #include <linux/init.h>
     
    MODULE_LICENSE("GPL");
    static char *name ="feifei";
    static int age=30;
    module_param(age,int,S_IRUGO);
    module_param(name,charp,S_IRUGO);
    
    static int __init hello_init(){
            printk(KERN_EMERG "Name:%s\n",name);
            printk(KERN_EMERG "Age:%d\n",age);
            return 0;
    }
     
    static void __exit hello_exit(void){
            printk(KERN_EMERG "Module exit\n");
    }
    module_init(hello_init);
    module_exit(hello_exit);
    /*注释
    moudle_param 宏定义来声明name,age 参数可用
    module_param 使用了 3 个参数: 变量名, 它的类型, 以及一个权限掩码用来做一个辅助的 sysfs 入口.
    这个宏定义应当放在任何函数之外, 典型地是出现在源文件的前面
    
    模块参数支持的类型:
    bool 一个布尔型( true 或者 false)值(相关的变量应当是 int 类型).
    invbool: invbool 类型颠倒了值, 所以真值变成 false, 反之亦然.
    charp 一个字符指针值. 内存为用户提供的字串分配, 指针因此设置.
    int long short uint ulong ushort
    
    数组参数: 用逗号间隔的列表提供的值, 模块加载者也支持. 声明一个数组参数, 使用:
    module_param_array(name,type,num,perm);
    这里 name 是你的数组的名子(也是参数名), type 是数组元素的类型, num 是一个整型变量, 
    perm 是通常的权限值. 如果数组参数在加载时设置, num 被设置成提供的数的个数. 模块加载者拒绝比数组能放下的多的值.
    S_IRUGO:权限值
    使用 S_IRUGO 作为参数可以被所有人读取, 但是不能改变; S_IRUGO|S_IWUSR 允许 root 来改变参数
    你应当不要使模块参数可写, 除非你准备好检测这个改变并且因而作出反应
    */
    


  4. Makefile内容如下:
  5. ifneq ($(KERNELRELEASE),)
    obj-m :=param.o
    else 
    KDIR:= /lib/modules/2.6.29/build
    all:
          make -C $(KDIR) M=$(PWD) modules
    clean:
          rm -f *.ko *.o *.mod.o *.mod.c .symvers
    endif

    如下是加载模块的操作
  6. [root@bogon 4-1-3]# insmod param.ko
  7. Message from syslogd@ at Wed Jun 15 22:06:41 2011 ...
  8. bogon kernel: Name:feifei
  9. Message from syslogd@ at Wed Jun 15 22:06:41 2011 ...
  10. bogon kernel: Age:30

  11. [root@bogon 4-1-3]# insmod param.ko name="zhang" age=10
  12. Message from syslogd@ at Wed Jun 15 22:08:57 2011 ...
  13. bogon kernel: Name:zhang
  14. Message from syslogd@ at Wed Jun 15 22:08:57 2011 ...
  15. bogon kernel: Age:10
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值