zoukankan      html  css  js  c++  java
  • module_param和module_param_array用法

    如何向模块传递参数? Linux kernel 提供了一个简单的框架。利用module_param和module_param_arra来实现。

    1. 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表示。
                #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
                
      这些宏不会声明变量,因此在使用宏之前,必须声明变量,典型地用法如下:

      static unsigned int int_var = 0;
      module_param(int_var, uint, S_IRUGO);
      insmod xxxx.ko int_var=x

    2. 传递多个参数可以通过宏 module_param_array(para , type , &n_para , perm) 实现。
      其中,para既是外部模块的参数名又是程序内部的变量名,type是数据类型,perm是sysfs的访问权限。指针n_para指向一个整数,其值表示有多少个参数存放在数组para中。
      para:参数数组;数组的大小才是决定能输入多少个参数的决定因素。
      n_para: 参数个数;这个变量其实无决定性作用;只要para数组大小够大,在插入模块的时候,输入的参数个数会改变n_para的值,最终传递数组元素个数存在n_para中。
      
      典型地用法如下:
      static int para[MAX_FISH];
      static int n_para;
      module_param_array(para , int , &n_para , S_IRUGO);

     源文件:info_test.c

    复制代码
     1 #include <linux/init.h>
     2 #include <linux/module.h>
     3 #include <linux/sysctl.h>
     4 #include <linux/stat.h>
     5 #include <linux/debugfs.h>
     6 #include <linux/seq_file.h>
     7 #include <linux/proc_fs.h>
     8 
     9 static char *name = "kevin";
    10 static int count = 2;
    11 static int para[8] = {1,2,3,4};
    12 static int n_para = 1;
    13 
    14 module_param(count, int, S_IRUGO);
    15 module_param(name, charp, S_IRUGO);
    16 module_param_array(para , int , &n_para , S_IRUGO);
    17 
    18 static int info_init(void)
    19 {
    20     printk("init first_drv drv!
    ");
    21 
    22     int i;
    23     for (i = 0; i < count; i++) //count输入3, name输入kevin
    24         printk(KERN_ALERT "(%d) Hello, %s
    ", i, name);
    25 
    26     for (i = 0; i < 8; i++)
    27         printk(KERN_ALERT "para[%d] : %d 
    ", i, para[i]); //para输入6,7,8,9
    28 
    29     for(i = 0; i < n_para; i++) //n_para的值等于para输入的个数,参考上面的para参数,所有这里等于4;如果para我输入6,7,则n_para等于2
    30         printk(KERN_ALERT "para[%d] : %d 
    ", i, para[i]);
    31 
    32     return 0;
    33 }
    34 
    35 static void info_exit(void)
    36 {
    37     printk("%s()
    ",__func__);
    38 }
    39 
    40 module_init(info_init);
    41 module_exit(info_exit);
    42 
    43 MODULE_LICENSE("GPL");
    复制代码

     Makefile:

    复制代码
    1 obj-m:=info_test.o   
    2 CURRENT_PATH:=$(shell pwd)   
    3 VERSION_NUM :=$(shell uname -r)   
    4 LINUX_PATH  :=/usr/src/linux-headers-$(VERSION_NUM)   
    5 
    6 all :   
    7     make -C $(LINUX_PATH) M=$(CURRENT_PATH) modules   
    8 clean :   
    9     make -C $(LINUX_PATH) M=$(CURRENT_PATH) clean  
    复制代码

    编译成ko文件info_test.ko,运行在linux本机或者arm开发板中。

     

     通过dmesg查看打印信息:

    参考地址:https://www.cnblogs.com/mylinux/p/5670279.html

  • 相关阅读:
    Google和百度、雅虎的站内搜索代码
    Unidac:解决“trying to modify readonly Field”问题!
    如何通过BDE连接一个非1433端口的SQL SERVER
    工作总结
    iOS开发肯定会遇到的
    自定义delegate和系统定义dalegate的区别
    C语言中关于字符串左右循环移位的问题
    iphone 文件保存策略
    iphone学习各种资源
    IOS开发系列之阿堂教程:tableView的下拉涮新功能实践
  • 原文地址:https://www.cnblogs.com/try-again/p/9179022.html
Copyright © 2011-2022 走看看