Chinaunix首页 | 论坛 | 博客
  • 博客访问: 469536
  • 博文数量: 134
  • 博客积分: 3056
  • 博客等级: 中校
  • 技术积分: 1150
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-14 15:53
文章分类
文章存档

2013年(1)

2010年(133)

我的朋友

分类: LINUX

2010-07-30 00:00:57

1.linux-2.4内核
 
1. 1 MODULE_PARM (变量名, 描述变量的字符串(也就是变量类型)
如:
 

int skull_ival=0;
char *skull_sval;
MODULE_PARM (ival, "i");
MODULE_PARM (sval, "s");

 
又如:至少有两个元素、至多不超过4 个元素的数组可定义为:

int skull_array[4];
MODULE_PARM (skull_array, "2-4i");

描述变量的字符串(也就是变量类型, 也就是模块参数)目前只支持五种类型:

  • b:byte
  • h:short
  • i : int
  • l : long
  • s : string

    如果是字符串值,则需要声明一个指针变量。

    // 示例代码

    #include <linux/module.h>
    #include <linux/kernel.h>

    static int onevalue = 1;
    static char *twostring = NULL;

    MODULE_PARM (onevalue, "i");
    MODULE_PARM (twostring, "s");

    int __init test_init(void)
    {
            printk ("Hello world!\n onevalue=%d, twostring=%s\n", onevalue, twostring);
            return 0;
    }

    void __exit test_exit(void)
    {
            printk ("Goodbye world\n");
    }

    module_init(test_init);
    module_exit(test_exit);


    1.2 MODULE_PARM_DESC(变量名, 描述性信息)

    这段描述存储在目标文件中,能够用类似 objdump 的工具查看,也可用自动的系统管理工具来显示。
    例如:

    int base_port = 0x300;
    MODULE_PARM (base_port, "i");
    MODULE_PARM_DESC (base_port, "The base I/O port (default 0x300)");

    1.3 MODULE_AUTHOR(name)
    将模块作者名加入目标文件

    1.4 MODULE_DESCRIPTION(desc)
    在目标文件中增加模块描述文字

    1.5 MODULE_SUPPORTED_EDVICE(dev)
    描述模块所支持的设备。内核中的注释指明这个参数可能最终用来帮助模块自动装载,然而目前还没有起到这种作用


    2.linux-2.6内核
    2.1 module_param (变量名, 变量类型, 使用属性)
    2.6内核
    不再采用2.4内核中的字符串形式,而且在模块编译时会将此处申明的变量类型与变量定义的类型进行比较,判断是否一致。而且必须显式包含#include linux/moduleparam.h>

    变量类型可以是

    • short: short
    • ushort: unsigned short
    • int: int
    • unit: unsigned int
    • long: long
    • ulong:unsigned long
    • charp: char*
    • bool: int
    • invbool: int
    • intarray: int*

    使用属性
    除了特殊情况,通常把文件结点属性指定为 0。该参数用来设置用户的访问权限,普通用户能在内核上加载模块的几率很少。如果一定要设置结点,可用文件权限 (permission) 等概念指定 0644 等八进制数。

    2.2 module_param_array(变量名1, 变量类型, 指向变量2(指定前面变量1的个数)的指针(2.6.10可以直接用变量), 使用属性)

    //示例代码

    #include linux/module.h>
    #include linux/init.h>
    #include linux/moduleparam.h>
    #include linux/stat.h>
    #define SIZE 10
    static int a[SIZE], n;
    static int onevalue = 1;
    static char *twostring = NULL;

    module_param (onevalue, int, 0);
    module_param (twostring, charp, 0);
    module_param_array(a, int, &n, S_IRUGO);
    static int __init test_init(void)
    {
            int i;
            for (i = 0; i < n; ++i)
                    printk(KERN_ALERT "%d\n", a[i]);
            printk ("Hello, world!\n onevalue=%d, twostring=%s\n", onevalue, twostring);
            return 0;
    }
    static void __exit test_exit(void)
    {
            printk ("Goodbye, world\n");
            return;
    }
    MODULE_LICENSE("GPL");
    module_init(test_init);
    module_exit(test_exit);

    2.3 其他

    module_param_call(name, set, get, arg, perm)
    module_param_named(name, value, type, perm)

    3.同时适用于2.4与2.6内核的模块参数模板

    //适用于2.4与2.6内核的模块参数模板

    #include linux/module.h>
    #include linux/init.h>
    #ifdef LINUX26
    #include <linux/moduleparam.h>
    #endif
    #include linux/stat.h>
    #define SIZE 10
    static int a[SIZE];
    static int onevalue = 1;
    static char *twostring = NULL;
    #ifdef LINUX26
    static int n;

    module_param (onevalue, int, 0);
    module_param (twostring, charp, 0);
    #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 10)
    module_param_array(a, int, &n, S_IRUGO);
    #else
    module_param_array(a, int, &n, S_IRUGO);
    #endif
    #else
    MODULE_PARM (onevalue, "i");
    MODULE_PARM (twostring, "s");
    #endif


  • 阅读(1358) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~