美文网首页Linux设备驱动
Linux设备驱动程序学习----6.模块的参数

Linux设备驱动程序学习----6.模块的参数

作者: micro虾米 | 来源:发表于2019-07-21 22:00 被阅读0次

    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设备驱动程序学习----目录

    相关文章

      网友评论

        本文标题:Linux设备驱动程序学习----6.模块的参数

        本文链接:https://www.haomeiwen.com/subject/fptblctx.html