6.模块的参数

模块参数

由于系统不同,驱动程序需要的参数也许会变化,包括设备编号、控制参数等。为满足这些需求,内核允许对驱动程序指定参数,而这些参数可在装载驱动程序模块时改变。这些参数的值可以在运行insmod或modprob命令装载模块时赋值,而modprobe命令还可以从它的配置文件(/etc/modprob.conf)中读取参数值。

例如:在前面“Hello world”模块的基础上进行扩展,添加两个参数:一个整数值howmany;另一个字符串whom;将向whom问候howmany次。可以使用命令:

insmod hellop.ko howmany=10 whom="Mom"

驱动程序的实现方式中,参数必须使用module_param()宏来声明,该宏需要三个参数:变量的名称、类型、及访问许可掩码,该宏必须放在驱动任何函数之外,通常在源文件的头部。

#include

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类型反转其值,即true变成false,而false变成true。

charp

字符指针值。内核会为用户提供的字符串分配内存,并设置指针。

int

long

short

uint

ulong

ushort

具有不同长度的基本整数值。以u开头的类型用于无符号值。

对于数组参数,在提供数组值时用逗号划分各数组成员。用以下宏:

module_param_array(name, type, num, perm);

name: 数组名称,即参数名称;

type: 数组元素的类型;

num: 是一个整型变量;

perm: 是常见的访问许可值;

模块装载器会拒绝接受超过数组大小的值。所有的模块参数都应该给定一个默认值,insmod命令只会在用户明确设置了参数的值的情况下才会改变参数的值。模块可以根据默认值来判断是否是一个显式指定的参数。

module_param()宏中的最后一个成员是访问许可值,这些宏定义在中定义,该值用来控制谁能够访问sysfs中对模块参数的表述。如果perm=0,就不会有对应的sysfs入口项;否则,模块参数会在/sys/module中出现,并设置为给定的访问许可。

perm:

S_IRUGO : 任何人都可以读取该值,但不能修改;

S_IRUGO | S_IWUSR : 允许root用户修改该参数;

注意:如果一个参数通过sysfs而被修改,则如同模块修改了这个参数值一样,但是内核不会以任何方式通知模块。多数情况下,我们不应该让模块参数是可写的,除非打算检测这中修改并作出相应的改动。

带参数的模块驱动程序如下所示:

#include

#include

static char *whom = "world";

static int howmany = 1;

module_param(whom, charp, S_IRUGO);

module_param(howmany, int, S_IRUGO);

static int __init hello_init(void)

{

int i = 0;

printk(KERN_ALERT "Hello, world\n");

printk(KERN_INFO "whom: %s, howmany: %d\n", whom, howmany);

for (i = 0; i < howmany; i++) {

printk(KERN_INFO "i= %d, whom: %s\n", whom);

}

return 0;

}

static void __exit hello_exit(void)

{

printk(KERN_ALERT "Goodbye, cruel world\n");

}

module_init(hello_init);

module_exit(hello_exit);

MODULE_LICENSE("Dual BSD/GPL");

默认加载模块运行如下:

# insmod my_module.ko

Hello, world

whom: world, howmany: 1

i = 0, whom: world

修改参数值加载模块运行如下:

# insmod my_module.ko whom="Hello world, so happy!" howmany=3

Hello, world

whom: Hello, howmany: 3

i = 0, whom: Hello

i = 1, whom: Hello

i = 2, whom: Hello

linux设备驱动 注册 命令6,Linux设备驱动程序学习----6.模块的参数相关推荐

  1. linux设备驱动 注册 命令6,Linux设备驱动调试

    GDB基本用法 GDB是GNU开源组织发布的一项强大的UNIX下的程序调试工具,GDB主要完成下面4个方面的功能 1.启动程序,可以按照工程师自定义的要求运行程序 2.让被调试的程序在工程师的指定端点 ...

  2. linux 块设备驱动 (三)块设备驱动开发

    linux 块设备驱动 (三)块设备驱动开发 一: 块设备驱动注册与注销 块设备驱动中的第1个工作通常是注册它们自己到内核,完成这个任务的函数是 register_blkdev(),其原型为: int ...

  3. Linux:驱动之自动创建字符设备的设备文件(未完)

    自动创建字符设备的设备文件 目前尚不是最终版本,还望有心人自己学习的时候,把自己整合的知识点相关的答案也好问题也好,或者实践过程中的一些操作截图,再或者其他的一些想要分享材料发给笔者邮箱:uestc_ ...

  4. linux 设备驱动(一)——字符设备驱动

    linux 设备驱动(一)--字符设备驱动 一.概述 1.1 设备驱动介绍 1.2. 设备结构 1.2.1 设备号 1.2.2 驱动层次 1.3 设备驱动对外接口 1.4 设备驱动特点 二.字符设备驱 ...

  5. linux 块设备驱动(二)——块设备数据结构

    linux 块设备驱动(二)--块设备数据结构 本文来源于: 1. http://www.cnblogs.com/dyllove98/archive/2013/07/01/3165567.html 块 ...

  6. linux内核部件分析(十)——设备驱动模型之class,linux内核部件分析(十)——设备驱动模型之class...

    前面看过了设备驱动模型中的bus.device.driver,这三种都是有迹可循的.其中bus代表实际的总线,device代表实际的设备和接口,而driver则对应存在的驱动.但本节要介绍的class ...

  7. linux设备驱动之串口移植,linux设备驱动之UART移植

    对于串口驱动的移植准备自己分析一下源代码的,但是发现自己好多地方都只知道一 些皮毛,不明白其中的道理,所以我上网搜的时候发现有好多人写了很多很好的文章了,下面我转载的这篇就非常不错,一个困恼我好久的问 ...

  8. linux块设备驱动(一)——块设备概念介绍

    linux块设备驱动(一)--块设备概念介绍 本文来源于: 1. http://blog.csdn.net/jianchi88/article/details/7212370 2. http://bl ...

  9. 设备驱动,字符设备驱动、(总线)设备驱动模型、sysfs文件系统、平台设备驱动

    以下内容转载于微信公众号:嵌入式企鹅圈.如有侵权,请告知删除. 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术. 对于初学者来说会非常 ...

最新文章

  1. MyRocks: 为facebool 的社交图谱服务的LSM-tree存储引擎
  2. 并发Bug之源有三,请睁大眼睛看清它们
  3. python三十五:pickle模块
  4. PyCharm的高效使用技巧
  5. C++中的继承(一)
  6. 全国计算机二级vb 无纸化,2013年3月全国计算机等级考试二级VB无纸化上机题题库题干及答案解析(2)...
  7. win8 linux分区工具,Ubuntu下挂载Win8磁盘分区
  8. cmd小游戏_使用pygame制作Flappy bird小游戏
  9. Java中Map的使用
  10. 怎么样自己动手写OS
  11. 用反汇编理解指向指针的指针
  12. QT5之MYSQL操作
  13. [文件、数据库、XML]window phone 利用StreamWriter写入文件问题
  14. 苹果4s忘记id密码怎么办_iPhone手机ID密码忘记了怎么办?三种方法轻松解决问题...
  15. 中国软件企业上市透析(上)
  16. virtualBox 报VT-x is disabled in the BIOS for both all CPU modes (VERR_VMX_MSR_ALL_VMX_DI的错误
  17. 用python做一个文本翻译器,自动将中文翻译成英文,超方便的
  18. Python+Mysql实现教务管理系统
  19. 【解决】长虹电视连接不上WiFi
  20. pyinstaller打包三坑

热门文章

  1. 找回VisualStudio异常设置中丢失的“用户未处理的(User-unhandled)”列
  2. HDOJ 1286 HDU 1286 找新朋友 ACM 1286 IN HDU
  3. .NET处理异常--zt
  4. Enterprise Library 3.0 发布
  5. Java中的两种异常类型及其区别?
  6. 美团酒旅数据治理实践
  7. 【干货】2020顶级数据团队建设全景报告-清华大学.pdf(附下载链接)
  8. 首篇NLP图神经网络综述!127页文档让你全面了解这个领域
  9. 机器学习算法总结之朴素贝叶斯法
  10. 手机屏坏了怎么把里面存东西取出来_三年来,这十八个有关MT4的问题被问了三千遍...