zoukankan      html  css  js  c++  java
  • 4412 内核模块传参数

    单个参数

    • 应用程序中可以在main的参数传值
    • 头文件在"include/linux/moduleparam.h"
    • 内核模块可以通过module_param来传单个参数
      • module_param(name, type, perm)
      • name:模块参数的名称
      • type:模块参数的数据类型(支持int long short uint ulong ushort 类型)
      • perm:模块参数的访问权限(S_IRUSR参数表示所有文件所有者可读)

    多个参数

    • 传递多个参数module_param_array(name, type, nump, perm)
      • name:模块参数名称
      • type:模块参数的数据类型(支持int long short uint ulong ushort类型)
      • nump:保存参数个数的地址
      • perm:模块参数的访问权限(S_IRUSR参数表示所有文件所有者可读)

    内核模块传参数

    • 参数perm表示此参数在sysfs文件系统中所对应的文件结点的属性,其权限在include/linux/stat.h中有定义
    • 变量perm
      • #define S_IRUSR 00400 文件所有者可读
      • #define S_IWUSR 00200 文件所有者可写
      • #define S_IXUSR 00100 文件所有者可执行
      • #define S_IRGRP 00040 与文件所有者同组的用户可读
      • #define S_IWGRP 00020
      • #define S_IXGRP 00010
      • #define S_IROTH 00004 与文件所有者不同组的用户可读
      • #define S_IWOTH 00002
      • #define S_IXOTH 00001

    将数字最后三位转化为二进制:xxx xxx xxx,高位往低位依次看,第一位为1表示文件所有者可读,

    第二位为1表示文件所有者可写,第三位为1表示文件所有者可执行

    接下来三位表示文件所有者同组成员的权限,再下来三位为不同组用户权限

    • 将Makefile命令clean完善,执行clean命令可以将所有无关的文件删除
    • 在02_DriverModule_01例程的基础上编写简单模块module_param,测试模块传参数,并将传递的参数打印出来。
      • insmod /mnt/udisk/module_param.ko module_arg1=10 module_arg2=20 int_array=11,12,13,14,15,16,17,18
      • cat /sys/module/module_param/parameters/xxx 可以查询参数
    #include <linux/init.h>
    #include <linux/module.h>
    
    /* define module_param module_param_array header file */
    #include <linux/moduleparam.h>
    /* define perm's head file*/
    #include <linux/stat.h>
    
    MODULE_LICENSE("Dual BSD/GPL");
    MODULE_AUTHOR("TOPEET");
    
    static int module_arg1, module_arg2;
    static int int_array[50];
    static int int_num;
    
    module_param(module_arg1, int, S_IRUSR);
    module_param(module_arg2, int, S_IRUSR);
    module_param_array(int_array, int, &int_num, S_IRUSR);
    
    static int hello_init(void)
    {
            int i;
            printk(KERN_EMERG "module_arg1 is %d!
    ", module_arg1);
            printk(KERN_EMERG "module_arg2 is %d!
    ", module_arg2);
            if(int_num > 0) {
                    for(i=0;i<int_num;i++) {
                            printk(KERN_EMERG "int_array[%d] is %d!
    ", i, int_array[i]);
                    }
            }
            printk(KERN_EMERG "Hello World enter!
    ");
            return 0;
    }
    
    static void hello_exit(void)
    {
            printk(KERN_EMERG "HELLO World exit!
    ");
    }
    
    module_init(hello_init);
    module_exit(hello_exit);

    测试效果:

    [root@iTOP-4412]# insmod module_param.ko module_arg1=10 module_arg2=20 int_array                           
    =11,12,13,14,15,16,17,18
    [15894.520387] module_arg1 is 10!
    [15894.522007] module_arg2 is 20!
    [15894.525113] int_array[0] is 11!
    [15894.528173] int_array[1] is 12!
    [15894.531350] int_array[2] is 13!
    [15894.534412] int_array[3] is 14!
    [15894.537579] int_array[4] is 15!
    [15894.540702] int_array[5] is 16!
    [15894.543786] int_array[6] is 17!
    [15894.546949] int_array[7] is 18!
    [15894.550068] Hello World enter!
    [root@iTOP-4412]# cat /sys/module/mo                                                                       
    module_param/  mousedev/
    [root@iTOP-4412]# cat /sys/module/module_param/parameters/                                                 
    int_array    module_arg1  module_arg2
    [root@iTOP-4412]# cat /sys/module/module_param/parameters/module_arg1                                      
    10
    [root@iTOP-4412]# cat /sys/module/module_param/parameters/*                                                
    11,12,13,14,15,16,17,18
    10
    20
    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    手机端适配rem代码片段
    location记录<18.7.21>
    本地储存(localStorage)记录
    为什么size_t重要?(Why size_t matters)(转)
    Mac OS X 完全卸载MySQL
    ECMAScript6兼容性
    mac截屏
    javascript中array的map方法的使用
    Jquery对话框基本配置
    angular中封装fancyBox(图片预览)
  • 原文地址:https://www.cnblogs.com/ch122633/p/9459663.html
Copyright © 2011-2022 走看看