在用户态下编程可以通过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!\n",i,who);
     return 0;
}

static void hello_exit(void)
{
    printk(KERN_ALERT"Goodbye, %s!\n",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! 摘自http://blog.sina.com.cn/s/blog_53d7350f0100nclf.html

转载于:https://www.cnblogs.com/Huluwa-Vs-Aoteman/p/3440649.html

关于module_param()宏相关推荐

  1. linux下的module_param()解释【转】

    转自:http://blog.csdn.net/wavemcu/article/details/7762133 版权声明:本文为博主原创文章,未经博主允许不得转载. ***************** ...

  2. insmod module_param 模块参数

    模块参数 引导模块时,可以向它传递参数.要使用模块参数加载模块,这样写: insmod module.ko [param1=value param2=value ...] 为了使用这些参数的值,要在模 ...

  3. module_param的使用

    在用户态下编程可以通过main()的来传递命令行参数,而编写一个内核模块则通过module_param () module_param宏是Linux 2.6内核中新增的,该宏被定义在include/l ...

  4. 学习笔记四 :linux驱动之module_param的用法

    从 main函数说起 我们在用户太写程序时都喜欢用main函数的如果参数来向程序内传递数据 #include <stlib.h> #include <stdio.h> int ...

  5. LINUX设备驱动程序的注意事项(两)建设和执行模块

             <一>:设置測试系统 首先准备好一个内核源代码树,构造一个新内核,然后安装到自己的系统中.           <二>:HelloWorld模块 #inclu ...

  6. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #3 如何编写内核模块

    HACK #3 如何编写内核模块 本节将介绍向Linux内核中动态添加功能的结构-内核模块的编写方法. 内核模块 Linux内核是单内核(monolithic kernel),也就是所有的内核功能都集 ...

  7. 编写函数实现员工信息录入和输出_编写我的第一个Linux 内核模块“hello_module”...

    前言: Linux 内 核 模 块 全 称 为 " 动 态 可 加 载 内 核 模 块 (Loadable Kernel Module,LKM)",是系统内核向外部提供的功能插口. ...

  8. Linux 驱动开发之内核模块开发 (三)—— 模块传参

    一.module_param() 定义 通常在用户态下编程,即应用程序,可以通过main()的来传递命令行参数,而编写一个内核模块,则通过module_param() 来传参. module_para ...

  9. _Linux内核分析(二)-内核模块简介和简单内核模块实现

    一.Linux内核模块简介 1. 何为内核模块 在上一篇博文中我们先通过内核配置,在配置的过程中我们对内核的组件进行了选择(当然这个选择决定了我们内核的大小),然后才生成了我们最终的内核,那么我们如果 ...

最新文章

  1. 微生物所高程-郭良栋组(内附招聘)在菌根适应策略研究中取得进展
  2. OpenCV 4.2.0 发布,Intel 开源的计算机视觉库
  3. C++实现MD5加密
  4. 笔记本电脑风扇声音大_笔记本风扇噪音太大?教你怎么降低笔记本风扇噪音
  5. Vue 动画的封装
  6. Mac搜索技巧|高级设置搜索条件/属性/类型
  7. 为什么redis适合操作小数据,memcache适合操作大数据
  8. CentOS7.5安装WPS并解决字体报错
  9. html简单导航页单页源码
  10. linux显卡用amd还是NVIDIA,Linux NVIDIA显卡驱动年度横评,不同于AMD,NVI
  11. 发布本人整理的面试问题大全,为准备找工作的同行们尽一份力 希望大家多补充或回答
  12. PTA 7-3 查询水果价格 (15 分)
  13. Qt中Q_NULLPTR的作用
  14. Java集合是什么?
  15. 印度洋重建及东经九十度海岭
  16. WPF中的3D Wireframe
  17. 【C语言典例】——day7:尼科彻斯定理
  18. matlab中xcorr函数详解
  19. ubuntu nvidia独显和intel集显切换
  20. 机器学习(二) 学习规划及资料汇总

热门文章

  1. 几点减几点怎么列算式_节日礼品怎么挑选 这几点很关键
  2. java 浅克隆_(Java)浅克隆与深克隆的区别
  3. linux安装配置java,Linux 安装配置 java 环境
  4. 北京小学 计算机派位,北京小升初电脑派位原理详解!和对口直升入学有什么区别?...
  5. java hibernate方言_java – 如何在运行时获取Hibernate方言
  6. matlab gui 制动程序设计,Matlab的GUI程序设计程序.doc
  7. java sql 写入万条数据_如何快速向数据库插1000万数据?4种方法对比,它简单却速度最快
  8. apt编译java_自动生成代码工具--APT
  9. linux下dns劫持C语言实现,Linux下实现劫持系统调用的总结(上)--代码及实现
  10. linux dd 硬盘 脚本,如何使用dd命令测试Linux磁盘的读写速度