浅谈 MISC杂项设备

在虚拟机的 Ubuntu 系统上,如下图所示,使用命令“cat /proc/misc”,可以查看到 PC

机 Ubuntu 系统的杂项设备。

启动开发板,在超级终端中输入命令“cat /proc/misc”也可以查看对应的杂项设备。

前面介绍过主设备号只有 256 个,设备又非常多,所以引入了子设备号。

其中杂项设备的主设备号是 10,在任何 Linux 系统中它都是固定的。

一般将 Linux 驱动分为字符设备、块设备、网络设备,但是这个分类不能包含所有的设备,

所以将无法归类的设备统称为杂项设备,杂项设备可能用到字符设备、快设备、网络设备中的

一项或者多项设备。

如下图所示,进入源码文件夹,使用命令“ls drivers/char/”,可以查看到杂项设备的文

件“misc.c”。

如上图所示,可以看到它被编译为“misc.o”,也就是被编译进了内核 zImage 文件。

使用命令“vim drivers/char/Makefile”打开杂项设备文件的编译文件。如下图所示,可

以看到,这个文件相当于被强制编译的。

杂项设备设备部分完全制作好了,只需要添加子设备,非常方便,在后面实验操作中大家

就可以感受到。

这样杂项设备的引入即解决了设备号数量少的问题,又降低了使用难度,还能防止碎片化,

一举多得。

8.4 杂项设备注册函数以及结构体

杂项设备的头文件在“include/linux/miscdevice.h”,有两个需要掌握的函数和一个结

构体,如下图所示,在源码目录下使用命令“vim include/linux/miscdevice.h”。

如下图所示,到最底行。

有两个函数。

extern int misc_register(struct miscdevice * misc);

杂项设备注册函数;一般在 probe 中调用,参数是 miscdevice

extern int misc_deregister(struct miscdevice *misc);

杂项设备卸载函数;一般是在 hello_remove 中用于卸载驱动。

结构体 miscdevice 中参数很多,下面几个是常用的。

int .minor;设备号,赋值为 MISC_DYNAMIC_MINOR,这个宏定义可以查到为 10

const char *name;设备名称

const struct file_operations *fops;file_operations 结构体,在下一小节专门介绍。

ions 结构体

file_operations 结构体的成员函数属于驱动设计的主体内容,里面的函数和 Linux 系统

给应用程序提供系统接口一一对应。

file_operations 结构体在头文件“include/linux/fs.h”中,如下图所示,使用命令“vim

include/linux/fs.h”打开头文件。

查找“file_operations”,如下图所示,在 1546 行可以找到其定义。

如上图所示,可以看到结构体中包含的参数非常多。

struct module *owner;一般是 THIS_MODULE。

int (*open) (struct inode *, struct file *);对应上层的 open 函数,打开文件。

int (*release) (struct inode *, struct file *);对应上层的 close 函数,打开文件操作之后一

般需要关闭。

ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);读函数,上层应用从底层读取

函数。

ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);写函数,上层应用向底

层传输数据。

long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);这个函数功能和写

函数稍微有点重合,但是这个函数占用的内存非常小,主要针对 IO 口的控制。

其它结构体中的参数,具体用到再介绍。

简单程序实例:

#include <linux/init.h>

#include <linux/module.h>

/*驱动注册的头文件,包含驱动的结构体和注册和卸载的函数*/

#include <linux/platform_device.h>

/*注册杂项设备头文件*/

#include <linux/miscdevice.h>

/*注册设备节点的文件结构体*/

#include <linux/fs.h>

#define DRIVER_NAME "hello_ctl"

#define DEVICE_NAME "hello_ctl123"

MODULE_LICENSE("Dual BSD/GPL");

MODULE_AUTHOR("songmao");

static long hello_ioctl( struct file *files, unsigned int cmd, unsigned long arg){

printk("cmd is %d,arg is %d\n",cmd,arg);

return 0;

}

static int hello_release(struct inode *inode, struct file *file){

printk(KERN_EMERG "hello release\n");

return 0;

}

static int hello_open(struct inode *inode, struct file *file){

printk(KERN_EMERG "hello open\n");

return 0;

}

static struct file_operations hello_ops = {

.owner = THIS_MODULE,

.open = hello_open,

.release = hello_release,

.unlocked_ioctl = hello_ioctl,

};

static  struct miscdevice hello_dev = {

.minor = MISC_DYNAMIC_MINOR,

.name = DEVICE_NAME,

.fops = &hello_ops,

};

static int hello_probe(struct platform_device *pdv){

printk(KERN_EMERG "\tinitialized\n");

misc_register(&hello_dev);

return 0;

}

static int hello_remove(struct platform_device *pdv){

printk(KERN_EMERG "\tremove\n");

misc_deregister(&hello_dev);

return 0;

}

static void hello_shutdown(struct platform_device *pdv){

;

}

static int hello_suspend(struct platform_device *pdv,pm_message_t pmt){

return 0;

}

static int hello_resume(struct platform_device *pdv){

return 0;

}

struct platform_driver hello_driver = {

.probe = hello_probe,

.remove = hello_remove,

.shutdown = hello_shutdown,

.suspend = hello_suspend,

.resume = hello_resume,

.driver = {

.name = DRIVER_NAME,

.owner = THIS_MODULE,

}

};

static int hello_init(void)

{

int DriverState;

printk(KERN_EMERG "HELLO WORLD enter!\n");

DriverState = platform_driver_register(&hello_driver);

printk(KERN_EMERG "\tDriverState is %d\n",DriverState);

return 0;

}

static void hello_exit(void)

{

printk(KERN_EMERG "HELLO WORLD exit!\n");

platform_driver_unregister(&hello_driver);

}

module_init(hello_init);

module_exit(hello_exit);

时间: 2024-10-22 23:28:51

浅谈 MISC杂项设备的相关文章

浅谈企业网络安全设备之数据安全防护篇

此贴介绍的设备,均为数据安全防护类产品,与之前网络安全防护设备侧重点不同,之前侧重点在于整体的网络,而此贴所以介绍的安全设备更侧重数据安全. (1) 网闸      定义:全称安全隔离网闸.安全隔离网闸是一种由带有多种控制功能专用硬件在电路上切断网络之间的链路层连接,并能够在网络间进行安全适度的应用数据交换的网络安全设备 功能:主要是在两个网络之间做隔离并需要数据交换,网闸是具有中国特色的产品. 部署方式:两套网络之间 防火一般在两套网络之间做逻辑隔离,而网闸符合相关要求,可以做物理隔离,阻断网

[转] 浅谈移动端设备标识码:DeviceID、IMEI、IDFA、UDID和UUID

[心路历程] 最近刚好在思考工作中统计数据所用的标识码产生的数据误差到底有多大,借此机会几番搜索资料+请教大神,整理出此文. 因为自己是产品经理,所以出发点是整理知识点.理解个大概.知道什么不能用.什么标识是靠谱的,并不研究太深入.毕竟非专业开发,有时候若了解知识点太深入,反倒会更困惑(关联知识点太多).即使研究清楚了,工作中碰到和自己研究相悖的情况,也不好丢个文档告诉开发应该怎么做(除非很熟,但次数多了也伤感情). 此外,不同公司.不同开发可能对同一个词的释义/实现方式有略微不同,但基本上是这

驱动学习5-生成设备节点(杂项设备)

杂项设备的头文件在"include/linux/miscdevice.h"中,需要用到两个函数和一个结构体 杂项设备注册函数:int misc_register(struct misdevice *misc); 杂项设备卸载函数:int mis_deregister(struct misdevice *misc): struct misdevice{ int minor; const char *name; const struct file_operations *fops; str

[nRF51822] 14、浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(科普类干货)

蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体温计.耳温枪.皮肤水分计等), 再到智能家居等领域均占有一席之地. 而蓝牙低功耗(BLE)是在蓝牙4.0协议上修改以适用低功耗应用场景的一种蓝牙协议. 随着上一股智能消费类电子大潮的到来,BLE的各种应用也像雨后春笋般在市场上铺开. 如果想 紧跟蓝牙协议的最新动态 ,可以在https://www.b

浅谈数据库系统中的cache(转)

http://www.cnblogs.com/benshan/archive/2013/05/26/3099719.html 浅谈数据库系统中的cache(转) Cache和Buffer是两个不同的概念,简单的说,Cache是加速"读",而buffer是缓冲"写",前者解决读的问题,保存从磁盘上读出 的数据,后者是解决写的问题,保存即将要写入到磁盘上的数据.在很多情况下,这两个名词并没有严格区分,常常把读写混合类型称为buffer cache,本文后续的论述中,统一

【转】浅谈Nginx负载均衡与F5的区别

前言 笔者最近在负责某集团网站时,同时用到了Nginx与F5,如图所示,负载均衡器F5作为处理外界请求的第一道"墙",将请求分发到web服务器后,web服务器上的Nginx再进行处理,静态内容直接访问本地门户,动态数据则通过反向代理指向内网服务. 其实Nginx和F5这两者均可用作网站负载均衡,那二者有什么区别呢?笔者在此浅谈下Nginx与F5的一些区别. 目前很多网站或应用在设计之初都会为高并发的数据请求做负载均衡,不差钱的土豪用户一般会直接买F5硬件设备作为其负载均衡器,原因不用多

浅谈Android多屏幕的事

浅谈Android多屏幕的事 一部手机可以同时看片.聊天,还可以腾出一支手来撸!这么吊的功能(非N版本,非第三方也能实现,你不知道吧)摆在你面前,你不享用?不关注它是怎样实现的?你来,我就满足你的欲望! 一部手机可以同时看片.聊天,还可以腾出一支手来撸==!就像这样: 是时候告别来回切换应用屏幕的酸爽了,还可以在分屏模式下两Activity间直接拖放数据! 好高大上的样子!这是怎么实现的?别急,我们一一道来: kitkat(4.4)版本对多任务分屏的实现 由于相关的代码和功能被封装及隐藏起来,所

浅谈mysql主从复制的高可用解决方案

1.熟悉几个组件(部分摘自网络)1.1.drbd     —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID",开源软件,由 LINBIT 公司开发.DRBD 实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中.他是有内核 模块和相关程序而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID的功能.也就是说当你将数据写入本地的DRBD设备上的文件系统 时, 数据会同时被发送到网

浅谈安全性攻击人为攻击的主要形式和防御

0x01 安全性攻击主要的两种方式 当前,对信息系统(包括硬件.软件.数据.人.物理环境及其基础设施)的攻击来自多方面,这些攻击我们可以宏观地分为人为攻击(主观因素)和自然灾害攻击(客观因素),这两大类的攻击都会对信息安全构成威胁.造成自然灾害攻击的自然因素包括各种自然灾害:如水.火.雷.电.风暴.烟尘.虫害.鼠害.海啸和地震等:系统的环境和场地条件,如温度.湿度.电源.地线和其他防护设施不良造成的威胁:电磁辐射和电磁干扰的威胁:硬件设备自然老化,可靠性下降的威胁等.因为自然灾害往往不可预知和抗