module_param 在内核编程中的作用

module_param

  在用户态下编程可以通过main()的来传递命令行参数,而编写一个内核模块则通过module_param()!

module_param的作用
一.module_param
1.为什么引入
 在用户态下编程可以通过main()来传递命令行参数,而编写一个内核模块则可通过module_param()来传递命令行参数

内核允许对驱动程序在加载的时候传递参数,在编写内核程序的时候。要在代码中用宏module_param来指定接受的参数名,而这个宏在<linux/moduleparam.h>中的定义如下
/* Helper functions: type is byte, short, ushort, int, uint, long,
   ulong, charp, bool or invbool, or XXX if you define param_get_XXX,
   param_set_XXX and param_check_XXX. */

#define module_param_named(name, value, type, perm)               \
    param_check_##type(name, &(value));                   \
    module_param_call(name, param_set_##type, param_get_##type, &value, perm); \
    __MODULE_PARM_TYPE(name, #type)

#define module_param(name, type, perm)                \
    module_param_named(name, name, type, perm)


由此可知
module_param的实现是通过module_param_named(name, name, type, perm)的。
其中使用了 3 个参数:要传递的参数变量名,变量的数据类型,以及访问参数的权限
测试模块,源程序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 hellowho="world"times=5出现5次"hello,world!": #(1)hello,world! #(2)hello,world! #(3)hello,world! # (4)hello,world! #(5)hello,world!
卸载: # rmmodhello出现: #Goodbye,world!

 

驱动程序module的工作流程主要分为四个部分:

1、 insmod module
2、 驱动module的初始化初始化结束后即进入“潜伏”状态,直到有系统调用
3、 当操作设备时,即有系统调用时,调用驱动module提供的各个服务函数
4、 rmmod module

一、 驱动程序的加载
Linux驱动程序分为两种形式一种是直接编译进内核另一种是编译成module,然后在需要该驱动module时手动加载。

在用insmod加载module时,还可以给提供模块参数,如:
static char *whom=”world”;
static int howmany=10;
module_param(howmany,int,S_IRUGO);
module_param(whom,charp,S_IRUGO);

这样,当使用insmod scull.ko whom=”string” howmany=20这样的命令加载驱动时,whom和howmay的值就会传入scull驱动模块了。

二、 驱动module的初始化
scull_init_module函数中主要做了以下几件事情:

a) 分配并注册主设备号次设备号

int register_chrdev_region(dev_t first, unsigned int count, char *name)
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name)

b) 初始化代表设备的struct结构体:scull_dev

c) 初始化互斥体init_MUTEX

d) 初始化在内核中代表设备的cdev结构体,最主要是将该设备与file_operations结构体联系起来。在Linux内核中,cdev结构体才是真正代表了某个设备。在内核调用设备的open,read等操作之前,必须先分配并注册一个或者多个cdev结构。

三、设备操作
涉及open ,close ioclt,release等函数

四、卸载
scull_cleanup_module

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

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

相关文章

ubuntu 备忘

卷组扩容 Linux mint采用默认卷组的安装方式 sainLinux ~ $ df -hl Filesystem Size Used Avail Use% Mounted on udev 3.7G 0 3.7G 0% /dev tmpfs 743M 9.5M 733M 2% /run /dev/mapper/mint--vg-root…

DDL DML DCL

2019独角兽企业重金招聘Python工程师标准>>> DDL is Data Definition Language statements. Some examples:数据定义语言&#xff0c;用于定义和管理 SQL 数据库中的所有对象的语言 DML is Data Manipulation Language statements. Some examples:数据操作语言&…

学习halcon的论坛与书籍

论坛、培训 halcon学习网&#xff1a;http://www.ihalcon.com/鸟叔机器视觉&#xff1a;http://bbs.szvbt.com/forum.php 博客 韩兆新的博客园majunfuLife and Codingzhaojun的博客風韻無聲骑蚂蚁上高速的博客小马_xiaoLV2小新识图程序园-程序员的世界章柯渊的博客 注&…

LINUX内核中的xx_initcall初始化标号

LINUX内核中的xx_initcall初始化标号 田海立CSDN 2011-07-02 LINUX内核中有很多的初始化指示标志postcore_initcall(), arch_initcall(), subsys_initcall(), device_initcall(), etc. 这些起什么作用呢&#xff1f;查阅源代码&#xff08;android goldfish-2.6.29&#xff09;…

代码习惯---打印参数

打印参数很重要。转载于:https://www.cnblogs.com/Andomly/p/6050773.html

javascript设置和获取cookie的方法

设置cookie的方法&#xff0c;和获取cookie的方法例如以下 设置cookie document.cookie"name"value;//获取cookie当中index是cookie的名称function getCookie(index){var allcookies document.cookie; var cookie_pos allcookies.indexOf(index);if (cookie_pos !…

favicon.ico--网站标题小图片二三事

前言: 什么是favicon? 直接用图说话:这个就是favicon favicon.ico 是一种格式&#xff0c;一般用于网页地址栏前或者在标签上以缩略方式显示网站标志&#xff0c;也可以拖曳favicon到桌面以建立到网站的快捷方式。为什么要设置favicon图标&#xff0c;以图像形态显示&#xff…

镜头MTF传递函数解读

什么是镜头的MTF曲线&#xff1f;MTF全称是Modulation Transfer Function&#xff0c;译为调制传递函数&#xff0c;其单位以line/mm来表示。MTF综合反映了镜头的反差和分辨率特性&#xff0c; MTF是用仪器测量的&#xff0c;因而可以完全排除胶片等客观因素的影响和人工判读的…

Java的线程模型

并发不一定要依赖多线程&#xff08;如PHP中很常见的多进程并发&#xff09;&#xff0c;但是在Java里面谈论并发&#xff0c;大多数都与线程脱不开关系。 线程是比进程更轻量级的调度执行单位&#xff0c;线程的引入&#xff0c;可以把一个进程的资源分配和执行调度分开&#…

BT656/BT601/BT1120协议以及DM365/DM355/DM6467上使用的YUV颜色空间说明

ITU-R BT.601和ITU-RBT.656国际电信联盟&#xff08;International Telecommunication Union&#xff09;无线通信部门&#xff08;ITU-R&#xff09;制定的标准。严格来说&#xff0c;ITU-R BT.656应该是隶属ITU-R BT.601的一个子协议。ITU-R BT.601是演播室数字电视编码参数标…

eclispe设置workspace text file encoding

在windows下开发&#xff0c;经常会遇到eclipse新导入的工程 java代码中的注释或者字符串中文显示乱码&#xff0c;每次都要一个个项目更改麻烦&#xff0c;特地找了下&#xff0c;可通过如下方法一次性设置。 转载于:https://www.cnblogs.com/zhjh256/p/7190537.html

工业定焦镜头的选型公式

工业镜头的焦距(f mm)可以根据FOV(视场), WD(工作距离) 和CCD芯片尺寸计算出来:FOV视场指被摄取物体的大小&#xff0c;视场的大小是以镜头至被摄取物体距离(WD)&#xff0c;镜头焦距(F)及CCD芯片尺寸确定的。镜头的焦距&#xff0c;视场大小、工作距离、光学倍率计算如下:焦距…

Nginx系列二:(Nginx Rewrite 规则、Nginx 防盗链、Nginx 动静分离、Nginx+keepalived 实现高可用)...

一、Nginx Rewrite 规则 1. Nginx rewrite规则 Rewrite规则含义就是某个URL重写成特定的URL&#xff08;类似于Redirect&#xff09;&#xff0c;从某种意义上说为了美观或者对搜索引擎友好&#xff0c;提高收录量及排名等。 语法&#xff1a; rewrite<regex><replace…

受限玻尔兹曼机(RBM)以及对比散度(CD)

1. RBM 的提出 BM 的缺点&#xff1a; 计算时间漫长&#xff0c;尤其是无约束自由迭代的负向阶段&#xff1b;对抽样噪音敏感&#xff1b;流行软件的不支持&#xff1b;受限玻尔兹曼机&#xff08;Restricted Boltzmann Machine,简称 RBM&#xff0c;以解决 BM 的学习效率过慢的…

嵌入式系统中看门狗概述。。。

一直以来对于嵌入式中的watch dog&#xff08;看门狗&#xff09;都比较陌生&#xff0c;一直都不知道它到底是做什么的&#xff0c;单从名字上看也不知其所以然&#xff0c;然后就在网上找到了一篇blog&#xff0c;就是再说看门狗的作用和概述&#xff0c;原文如下&#xff1a…

MySQL中的运算符

算术运算符 MySQL 支持常见的五种算术运算&#xff1a;, -, *, /(同 DIV 函数), %(同 MOD 函数)&#xff0c;即加减乘除和取余。&#xff08;被除数为 0则结果为 NULL&#xff09; 比较运算符 当使用 SELECT 语句进行查询时&#xff0c;MySQL 允许用户对表达式的左边操作数和右…

Qt中查看ui_xxx.h文件方法

前提 1、Qt当有界面 2、构造完成 满足以上两个条件qt会生成ui_xxx.h文件。 如何查看 方法1 在cpp文件中找到UI下的一个对象 如&#xff1a; ui->textEdit Ui::QWDialog按住Ctrl键&#xff0c;使用鼠标左键点击UI下的一个对象&#xff0c;如&#xff1a;textEdit、QWDia…

springCloud Finchley 实战入门(基于springBoot 2.0.3)【三 Eureka-高可用服务注册中心】...

Eureka高可用注册中心 Eureka Server的设计一开始就考虑到了高可用的问题&#xff0c;在eureka服务治理设计中&#xff0c;所有的节点即是是服务提供方&#xff0c;也是服务消费方。 在部署高可用注册中心前我们先需要准备一下&#xff0c;本地环境。因为我们实例是在单台电脑上…

Spring 读取配置文件(二)

Spring 读取配置文件并调用 bean package cn.com.test.receive;import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class…

DaVinci的Buffer_Handle和BufTab Cmem函数调用

DaVinci的dvsdk里面&#xff0c;所有的内存用的都是CMEM&#xff0c;而比较上层的一个封装就是BufTab和Buffer_Handle了 每个Tab可以控制好多块内存块。 具体到内存块有两种&#xff0c;一种是创建的时候指定他的大小啊&#xff0c;物理地址啥的。另外一种就是仅仅创建出这个 …