博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux驱动: 如何向模块传递参数, module_param和module_param_array
阅读量:5149 次
发布时间:2019-06-13

本文共 2282 字,大约阅读时间需要 7 分钟。

如何向模块传递参数,Linux kernel 提供了一个简单的框架.

 
  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表示。
            0    表示完全关闭在sysfs中相对应的项。
            #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的访问权限。指针nump指向一个整数,其值表示有多少个参数存放在数组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); 

 

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
static char *name = "Ocean";static int count = 2;static int para[8] = { 1,2,3,4};static int n_para = 1;module_param(count, int, S_IRUGO);module_param(name, charp, S_IRUGO);module_param_array(para , int , &n_para , S_IRUGO);static struct file_operations first_drv_fops={ .owner = THIS_MODULE, .open = first_drv_open, .write = first_drv_write,};int first_drv_init(void){ printk("init first_drv drv!\n"); int i; for (i = 0; i < count; i++) printk(KERN_ALERT "(%d) Hello, %s !\n", i, name); for (i = 0; i < 8; i++) printk(KERN_ALERT "para[%d] : %d \n", i, para[i]); for(i = 0; i < n_para; i++) printk(KERN_ALERT "para[%d] : %d \n", i, para[i]); return 0;}void first_drv_exit(void){ printk("exit first_drv drv!\n");} module_init(first_drv_init);module_exit(first_drv_exit);MODULE_AUTHOR("Ocean Byond");MODULE_DESCRIPTION("my first char driver");MODULE_LICENSE("GPL");

 

数组大小为8,但只传入4个参数,则n_para=4.

 

数组大小为8,但只传入8个参数,则n_para=8.

 

数组大小为8,传入9个参数,数组不够大,无法传入.

 

转载于:https://www.cnblogs.com/mylinux/p/5670279.html

你可能感兴趣的文章
hadoop2.2.0+hive-0.10.0完全分布式安装方法
查看>>
WebForm——IIS服务器、开发方式和简单基础
查看>>
小实验3:实现haproxy的增、删、查
查看>>
Angular中ngModel的$render的详解
查看>>
读《格局》| 未到年纪的真理
查看>>
[转]《城南旧事》里的《送别》
查看>>
django知识点总结
查看>>
C++ STL stack、queue和vector的使用
查看>>
OAuth2 .net MVC实现获取token
查看>>
java中XML操作:xml与string互转、读取XML文档节点及对XML节点增删改查
查看>>
使用Reporting Services时遇到的小问题
查看>>
传递事件和传递命令系统···
查看>>
约瑟夫问题
查看>>
Arduino 报错总结
查看>>
树莓派Android Things物联网开发:树莓派GPIO引脚图
查看>>
ckplayer网页播放器简易教程
查看>>
Android Studio 学习(六)内容提供器
查看>>
作业1:求500到1000之间有多少个素数,并打印出来
查看>>
for循环:用turtle画一颗五角星
查看>>
浅谈JavaScript中的eval()
查看>>