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

一、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
在CODE上查看代码片派生到我的代码片
  1. #include <linux/init.h>  
  2. #include <linux/module.h>  
  3. #include <linux/moduleparam.h>  
  4. MODULE_LICENSE ("GPL");  
  5.   
  6. static char *who = "world";  
  7. static int times = 1;  
  8. module_param (times, int, S_IRUSR);  
  9. module_param (who, charp, S_IRUSR);  
  10.   
  11. static int hello_init (void)  
  12. {  
  13. int i;  
  14. for (i = 0; i < times; i++)  
  15. printk (KERN_ALERT "(%d) hello, %s!\n", i, who);  
  16. return 0;  
  17. }  
  18.   
  19. static void hello_exit (void)  
  20. {  
  21. printk (KERN_ALERT "Goodbye, %s!\n", who);  
  22. }  
  23.   
  24. module_init (hello_init);  
  25. module_exit (hello_exit);  

编译生成可执行文件hello

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

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  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  该目录下生成变量对应的文件节点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

一、模块的编译 我们在前面内核编译中驱动移植那块&#xff0c;讲到驱动编译分为静态编译和动态编译&#xff1b;静态编译即为将驱动直接编译进内核&#xff0c;动态编译即为将驱动编译成模块。 而动态编译又分为两种&#xff1a; a -- 内部编译 在内核源码目录内编译 b -- 外部…

Exynos4412 文件系统制作(三)—— 文件系统移植

根文件系统一直以来都是所有类Unix操作系统的一个重要组成部分&#xff0c;也可以认为是嵌入式Linux系统区别于其他一些传统嵌入式操作系统的重要特征&#xff0c;它给Linux带来了许多强大和灵活的功能&#xff0c;同时也带来了一些复杂性。我们需要清楚的了解根文件系统的基本…

Snapchat, 给年轻人要的安全感

这几天&#xff0c;Snapchat因拒绝Facebook和谷歌的收购请求而名声大噪。40亿美金的收购请求&#xff0c;并不是任何一个人都可以淡然处之的。一、关于SnapchatSnapchat由两位斯坦福大学生创办&#xff0c;在2011 年9月上线。Snapchat的主要是所有照片都有一个1到10秒的生命期&…

Exynos4412 文件系统制作(二)—— 文件系统简介

一、Linux磁盘分区和目录 Linux发行版本之间的差别很少&#xff0c;差别主要表现在系统管理的特色工具以及软件包管理方式的不同。目录结构基本上都是一样的。 Windows的文件结构是多个并列的树状结构&#xff0c;最顶部的是不同的磁盘&#xff08;分区&#xff09;&#xff0c…

python的urllib2模块

https://www.cnblogs.com/erliang/p/4063883.html https://blog.csdn.net/u014343243/article/details/49308043 https://docs.python.org/zh-cn/2.7/library/urllib2.html

Python中的yield

《python中yield的用法详解——最简单&#xff0c;最清晰的解释》 https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ https://www.runoob.com/w3cnote/python-yield-used-analysis.html

Exynos4412 内核移植(七)—— 内核相关知识补充

一、内核调试方法简单分析 1、addr2line: 解决oops错误 a -- oops消息 oops&#xff08;也称 panic&#xff09;&#xff0c;称程序运行崩溃&#xff0c;程序崩溃后会产生oops消息。应用程序或内核线程的崩溃都会产生oops消息&#xff0c;通常发生oops时&#xff0c;系统不会发…

MM引擎新应用——爱车加油记

基于MM应用引擎开发的EXTJS应用&#xff0c;车主每次加完汽油后&#xff0c;记录加油时的里程数以及加油金额和汽油价格&#xff0c;就可计算出上次加油后行驶的里程数、上次加油的平均油耗。点击刷新按钮&#xff0c;即可计算有记录以来的行驶公里数和再次期间加油金额和平均油…

Python风格

Python3学习之Python风格指南 PEP8 – Python代码样式指南&#xff08;中文版&#xff09;

### 阅读之痕-2013/11

2019独角兽企业重金招聘Python工程师标准>>> 阅读之痕-2013/11 Andy erpingwugmail.com 2013/11/01-2013/11/30 2013/11/01-2013/11/30 The story of rocksdb - Embedded key-value store for Flash and RAM http://rocksdb.org/intro.pdf High Performance Network…

Exynos4412 内核移植(六)—— 设备树解析

一、描述ARM Device Tree起源于OpenFirmware (OF)&#xff0c;在过去的Linux中&#xff0c;arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码&#xff0c;相当多数的代码只是在描述板级细节&#xff0c;而这些板级细节对于内核来讲&#xff0c;不过是垃圾&#xff…

Github Page创建个人主页以及绑定域名

2019独角兽企业重金招聘Python工程师标准>>> 在github中 我们可以通过github page创建个人主页 以及绑定域名 据说有300m空间 以及无限流量 不过只能支持静态html 以及一些脚本语言 顺便吐槽一下 阿里云最低配那个云空间服务器 512m内存 启动web服务器后 mys…

python基础-类

实例属性和类属性 类中&#xff0c;没有self指定的是类属性&#xff0c;有self指定的是实例属性。类中的方法是类属性。 类和实例都是名字空间。类是类属性的名字空间&#xff0c;实例时实例属性的名字空间。 可以通过类访问类属性&#xff0c;通过实例访问实例属性。如果实例…

Exynos4412 内核移植(五)—— 驱动的移植

以移植自己制作的驱动&#xff0c;学习内核移植中的驱动移植&#xff0c;及 驱动程序的动态编译和静态编译 硬件环境&#xff1a; Linux 内核版本&#xff1a;Linux 3.14 主机&#xff1a;Ubuntu 12.04发行版 目标机&#xff1a;FS4412平台 交叉编译工具&#xff1a;arm-none-l…

FTP文件共传输服务

FTP文件共传输服务一&#xff0c;vsftpd服务基础&#xff08;1&#xff09;&#xff0c;FTP服务概述FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是典型的C/S结构的应用层协议&#xff0c;需要由服务端软件、客户端软件共同实现文件传达输功能…

python基础-super

Super返回的是mro列表中的下一个类 python的super详解(二) 文档解释顺序MRO用于在祖先类中查找属性。每个定义的类&#xff0c;都有一个名为__mro__的属性&#xff0c;他是一个元组。 super(type[, ojb]) 给出type&#xff0c;super()返回type的父类。如果希望父类被绑定&#…

Exynos4412 内核移植(四)—— MMU 相关知识解析

一、MMU的产生 许多年以前&#xff0c;当人们还在使用DOS或是更古老的操作系统的时候&#xff0c;计算机的内存还非常小&#xff0c;一般都是以K为单位进行计算&#xff0c;相应的&#xff0c;当时的程序规模也不大&#xff0c;所以内存容量虽然小&#xff0c;但还是可以容纳当…

Mysql limit 子查询

为什么80%的码农都做不了架构师&#xff1f;>>> &#xff08;1&#xff09;mysql limit 不支持子查询像下面这条语句无法执行 SELECT * FROM b_c_s1 where CT_ID IN (SELECT DISTINCT CT_ID FROM b_c_s1 LIMIT 0,2); &#xff08;2&#xff09;应该在只查询外面再…

python描述符

Python中的描述符 Python基本语法之描述符 Python 为什么要使用描述符&#xff1f;