zoukankan      html  css  js  c++  java
  • 关于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)

    其中使用了 3 个参数:要传递的参数变量名, 变量的数据类型, 以及访问参数的权限。

    module_param (name,type,perm);

    module_param 使用了 3 个参数: 变量名, 它的类型, 以及一个权限掩码用来做一个辅助的 sysfs 入口(啥意思). 这个宏定义应当放在任何函数之外, 典型地是出现在源文件的前面.定义如:

    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 类型颠倒了值, 所以真值变成 false, 反之亦然.
    charp
    一个字符指针值. 内存为用户提供的字串分配, 指针因此设置.
    int
    long
    short
    uint
    ulong
    ushort
    基本的变长整型值. 以 u 开头的是无符号值.
    数组参数, 用逗号间隔的列表提供的值, 模块加载者也支持. 声明一个数组参数, 使用:
    module_param _array(name,type,num,perm);

    这里 name 是你的数组的名子(也是参数名),
    type 是数组元素的类型,
    num 是一个整型变量,
    perm 是通常的权限值.
    如果数组参数在加载时设置, num 被设置成提供的数的个数. 模块加载者拒绝比数组能放下的多的值.

    perm参数的作用是什么?

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

    perm参数的作用是什么?

    最后的 module_param 字段是一个权限值,表示此参数在sysfs文件系统中所对应的文件节点的属性。你应当使用 中定义的值. 这个值控制谁可以存取这些模块参数在 sysfs 中的表示.当perm为0时,表示此参数不存在 sysfs文件系统下对应的文件节点。 否则, 模块被加载后,在/sys/module/ 目录下将出现以此模块名命名的目录, 带有给定的权限.。
    权限在include/linux/stat.h中有定义
    比如:
    #define S_IRWXU 00700
    #define S_IRUSR 00400
    #define S_IWUSR 00200
    #define S_IXUSR 00100

    #define S_IRWXG 00070
    #define S_IRGRP 00040
    #define S_IWGRP 00020
    #define S_IXGRP 00010

    #define S_IRWXO 00007
    #define S_IROTH 00004
    #define S_IWOTH 00002
    #define S_IXOTH 00001

    使用 S_IRUGO 作为参数可以被所有人读取, 但是不能改变; S_IRUGO|S_IWUSR 允许 root 来改变参数. 注意, 如果一个参数被 sysfs 修改, 你的模块看到的参数值也改变了, 但是你的模块没有任何其他的通知. 你应当不要使模块参数可写, 除非你准备好检测这个改变并且因而作出反应.

    测试模块,源程序hello.c内容如下:
    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/moduleparam.h>        
    MODULE_LICENSE("Dual BSD/GPL");    

    static char *who= "world";            
    static int times = 1;       
    module_param(times,int,S_IRUSR);    
    module_param(who,charp,S_IRUSR);  

    static int hello_init(void)      
    {
        int i;
        for(i=0;i<times;i++)
           printk(KERN_ALERT "(%d) hello, %s! ",i,who);
         return 0;
    }

    static void hello_exit(void)
    {
        printk(KERN_ALERT"Goodbye, %s! ",who);
    }

    module_init(hello_init);
    module_exit(hello_exit);
    编译生成可执行文件hello

    插入:
    # insmod hello who="world" times=5
    出现5次"hello,world!":
    #(1)hello,world!
    #(2)hello,world!
    #(3)hello,world!
    #(4)hello,world!
    #(5)hello,world!
    卸载:
    # rmmod hello
    出现:
    #Goodbye,world! 关于module_param()宏
    摘自http://blog.sina.com.cn/s/blog_53d7350f0100nclf.html
  • 相关阅读:
    Linux 压缩,解压
    Angular 修改子组件的样式
    vue项目-各类卡顿问题记录
    老vue项目webpack3升级到webpack5全过程记录(二)
    老vue项目webpack3升级到webpack5全过程记录(一)
    eslint配置汇总
    cke点击时初始化编辑器后光标恢复的方法
    使用 SVG transform rotate 解决画框中的数字跟随旋转的问题
    关于 Selection(getSelection ) 对象的一些常规用法集锦
    markdown 的使用技巧
  • 原文地址:https://www.cnblogs.com/Huluwa-Vs-Aoteman/p/3440649.html
Copyright © 2011-2022 走看看