一、module_param() 定义

通常在用户态下编程,即应用程序,可以通过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)

所以我们通过宏module_param()定义一个模块参数:

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中相对应的项。

二、module_param() 使用方法

module_param()宏不会声明变量,因此在使用宏之前,必须声明变量,典型地用法如下:

static unsigned int int_var = 0;

module_param(int_var, uint, S_IRUGO);

这些必须写在模块源文件的开头部分。即int_var是全局的。也可以使模块源文件内部的变量名与外部的参数名有不同的名字,通过module_param_named()定义。

a -- module_param_named()

module_param_named(name, variable, type, perm);

name        外部(用户空间)可见的参数名;

variable    源文件内部的全局变量名;

type            类型

perm          权限

而module_param通过module_param_named实现,只不过name与variable相同。

例如:

static unsigned int max_test = 9;

module_param_name(maximum_line_test, max_test, int, 0);

b -- 字符串参数

如果模块参数是一个字符串时,通常使用charp类型定义这个模块参数。内核复制用户提供的字符串到内存,并且相对应的变量指向这个字符串。

例如:

static char *name;

module_param(name, charp, 0);

另一种方法是通过宏module_param_string()让内核把字符串直接复制到程序中的字符数组内。

module_param_string(name, string, len, perm);

这里,name是外部的参数名,string是内部的变量名,len是以string命名的buffer大小(可以小于buffer的大小,但是没有意义),perm表示sysfs的访问权限(或者perm是零,表示完全关闭相对应的sysfs项)。

例如:

static char species[BUF_LEN];

module_param_string(specifies, species, BUF_LEN, 0);

c -- 数组参数

数组参数, 用逗号间隔的列表提供的值, 模块加载者也支持. 声明一个数组参数, 使用:

module_param_array(name, type, num, perm);

name  数组的名子(也是参数名),

type     数组元素的类型,

num    一个整型变量,

perm   通常的权限值.

如果数组参数在加载时设置, num被设置成提供的数的个数. 模块加载者拒绝比数组能放下的多的值。

三、使用实例

[cpp] view plaincopy
  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/moduleparam.h>
  4. MODULE_LICENSE ("GPL");
  5. static char *who = "world";
  6. static int times = 1;
  7. module_param (times, int, S_IRUSR);
  8. module_param (who, charp, S_IRUSR);
  9. static int hello_init (void)
  10. {
  11. int i;
  12. for (i = 0; i < times; i++)
  13. printk (KERN_ALERT "(%d) hello, %s!\n", i, who);
  14. return 0;
  15. }
  16. static void hello_exit (void)
  17. {
  18. printk (KERN_ALERT "Goodbye, %s!\n", who);
  19. }
  20. module_init (hello_init);
  21. module_exit (hello_exit);

编译生成可执行文件hello

# insmod hello.ko who="world" times=5

[cpp] view plaincopy
  1. #(1) hello, world!
  2. #(2) hello, world!
  3. #(3) hello, world!
  4. #(4) hello, world!
  5. #(5) hello, world!
  6. # rmmod hello
  7. # Goodbye,world!

注 :

a -- 如果加载模块hello时,没有输入任何参数,那么who的初始值为"world",times的初始值为1

b -- 同时向指针传递字符串的时候,不能传递这样的字符串 who="hello world!".即字符串中间不能有空格

c --/sys/module/hello/parameters  该目录下生成变量对应的文件节点

Linux 驱动开发之内核模块开发 (三)—— 模块传参相关推荐

  1. Linux驱动篇之内核模块

    Linux驱动篇之内核模块 1.基本概念 模块与驱动: Linux中,将设备分为三种基本的类型. 字符设备 块设备 网络接口 Linux中还有一个很重要的概念,模块.可在运行时添加到内核中的代码被称为 ...

  2. linux驱动学习——模块传参

    3.模块传参 实验环境:ubunut32 虚拟机 3.1.模块传参的意义 和应用程序一样,可以在执行的时候通过命令行输入运行参数传递参数(main函数的参数),只不过方法不一样而已,这个就是模块传递参 ...

  3. vue模块给模块传参_Vue店面的Paypal支付模块

    vue模块给模块传参 Vue店面PayPal付款扩展 (Vue Storefront PayPal Payment Extension) PayPal Payment module for vue-s ...

  4. Python 跨类传参与跨模块传参

    笔者初学python,编写了一个小游戏进行参数传递练习,文字描述部分稍显简陋,还请见谅,现将代码贴上. Map.pyclass master_bedroom():def __init__(): pri ...

  5. Flutter开发之路由跳转与传参(七)

    参考练习:https://book.flutterchina.club/chapter2/flutter_router.html 路由(Route)在移动开发中通常指页面(Page),这跟web开发中 ...

  6. 微信小程序开发:路由跳转以及传参的使用

    前言 微信小程序开发中的大部分知识点和前端开发是一模一样的,就算具体的语法不一样,但是套路都是一样的,可以说微信小程序开发和前端开发使用的知识点基本一致.本篇博文就来分享一下在微信小程序开发中必用的知 ...

  7. linux文件编程(3)—— main函数传参、myCp(配置成环境变量)、修改配置文件、整数和结构体数组写到文件

    参考:linux文件编程(3)-- 文件编程的简单应用:myCp.修改配置文件 作者:丶PURSUING 发布时间: 2021-04-09 23:45:05 网址:https://blog.csdn. ...

  8. Linux 驱动开发之内核模块开发 (二)—— 内核模块编译 Makefile 入门

    一.模块的编译        我们在前面内核编译中驱动移植那块,讲到驱动编译分为静态编译和动态编译:静态编译即为将驱动直接编译进内核,动态编译即为将驱动编译成模块. 而动态编译又分为两种: a -- ...

  9. Linux 驱动开发之内核模块开发(四)—— 符号表的导出

    Linux内核头文件提供了一个方便的方法用来管理符号的对模块外部的可见性,因此减少了命名空间的污染(命名空间的名称可能会与内核其他地方定义的名称冲突),并且适当信息隐藏. 如果你的模块需要输出符号给其 ...

最新文章

  1. 为提高能量利用效率,大脑会对感官进行预测
  2. Android 将ARGB图片转换为灰度图
  3. JAVA自学笔记24
  4. 从库存管理系统,体验活字格强大的移动端应用开发能力
  5. shared_ptr智能指针源码剖析
  6. javascript引用bug带来的继承
  7. lisp 河道水面线计算_鹤岗河道用铸铁轻型闸门厂家
  8. 启用计算机浏览器摄像头,如何启用浏览器进行摄像头访问?
  9. 用‘slay’干掉某个用户的所有进程
  10. angular报错:Maximum call stack size exceeded
  11. Excel的序列号转换的算法
  12. 关于zblog模板当中标签、相关文章调用应该怎么来写
  13. 红警3命令与征服注册激活启动cdkey联机问题
  14. 2021年茶艺师(初级)考试资料及茶艺师(初级)模拟试题
  15. pyqtgraph 案例 002 Basic Plotting
  16. 微信PC版Hook发送群艾特消息研究
  17. 怎么画学计算机的男孩形象,怎么一步一步教大班幼儿画自己的画像:小男孩简笔画(步骤图解)...
  18. 高校BBS最HOT的100个笑话(不看保证后悔终身)
  19. 雷电模拟总是显示android启动,雷电模拟器启动失败如何解决?启动失败解决方法图文分享...
  20. 做流程图软件有哪些?来看看今天的分享

热门文章

  1. Windows7休眠状态下载技巧攻略
  2. VSFTP配置详解+虚拟用户的支持
  3. Unicode简介【转】
  4. python web应用_为您的应用选择最佳的Python Web爬网库
  5. 熊猫数据集_用熊猫掌握数据聚合
  6. opencv:卷积涉及的基础概念,Sobel边缘检测代码实现及Same(相同)填充与Vaild(有效)填充
  7. leetcode 220. 存在重复元素 III(排序)
  8. react控制组件中元素_React Interview问题:浏览器,组件或元素中呈现了什么?
  9. python:封装连接数据库方法
  10. CSU-1982 小M的移动硬盘