杂项设备的学习
来源:互联网 发布:钢琴练习软件 编辑:程序博客网 时间:2024/05/07 00:15
<span lang="zh-CN" style="font-family: 'Microsoft YaHei'; font-size: 11pt; background-color: rgb(255, 255, 255);">首先</span><span lang="en-US" style="font-family: 'Microsoft YaHei'; font-size: 11pt; background-color: rgb(255, 255, 255);">,</span><span lang="zh-CN" style="font-family: 'Microsoft YaHei'; font-size: 11pt; background-color: rgb(255, 255, 255);">先明确为什么要使用杂项设备</span><span lang="en-US" style="font-family: 'Microsoft YaHei'; font-size: 11pt; background-color: rgb(255, 255, 255);">,</span><span lang="zh-CN" style="font-family: 'Microsoft YaHei'; font-size: 11pt; background-color: rgb(255, 255, 255);">杂项设备相对于字符设备有什么优越的地方</span>
本文博客地址:http://blog.csdn.net/b2997215859/article/details/47183987
转载须注明来源:http://blog.csdn.net/b2997215859/article/details/47183987
这里转载知乎上的说法,还是有道理的
第一,节省主设备号:
使用普通字符设备,不管该驱动的主设备号是静态还是动态分配,都会消耗一个主设备号,这太浪费了。而且如果你的这个驱动最终会提交到内核主线版本上的话,需要申请一个专门的主设备号,这也麻烦。
如果使用misc驱动的话就好多了。因为内核中已经为misc驱动分配了一个主设备号。当系统中拥有多个misc设备驱动时,那么它们的主设备号相同,而用子设备号来区分它们。
第二,使用简单:
有时候驱动开发人员需要开发一个功能较简单的字符设备驱动,导出接口让用户空间程序方便地控制硬件,只需要使用misc子系统提供的接口即可快速地创建一个misc设备驱动。
当使用普通的字符设备驱动时,如果开发人员需要导出操作接口给用户空间的话,需要自己去注册字符驱动,并创建字符设备class以自动在/dev下生成设备节点,相对麻烦一点。而misc驱动则无需考虑这些,基本上只需要把一些基本信息通过structmiscdevice交给misc_register()去处理即可。
本质上misc驱动也是一个字符设备驱动,可能相对特殊一点而已。在drivers/char/misc.c的misc驱动初始化函数misc_init()中实际上使用了MISC_MAJOR(主设备号为10)并调用register_chrdev()去注册了一个字符设备驱动。同时也创建了一个misc_class,使得最后可自动在/dev下自动生成一个主设备号为10的字符设备。总的来讲,如果使用misc驱动可以满足要求的话,那么这可以为开发人员剩下不少麻烦。
来自 <http://www.zhihu.com/question/21508904>
-------------------------------------------------------------------------------------------------------------------
另外关于miscdevie的一些方法在内核中的描述,这里有一篇博文说的比较好,基本上都点到了
在Linux驱动中把无法归类的五花八门的设备定义为混杂设备(用miscdevice结构体表述)。miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不同。所有的miscdevice设备形成了一个链表,对设备访问时内核根据次设备号查找对应的miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。在内核中用struct miscdevice表示miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。miscdevice的API实现在drivers/char/misc.c中。
来自 <http://blog.csdn.net/angle_birds/article/details/8330407>
--------------------------------------------------------------------------------------------------------------------
以下是杂项设备的示例代码,示例代码来源于
http://blog.csdn.net/xhz1234/article/details/38750091
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/fs.h>
#include<linux/miscdevice.h>
#define DEVICE_NAME "my_misc_dev" //声明设备名称
static intmisc_open(struct inode *nd, struct file *filp)
{
int major = MAJOR(nd->i_rdev); //获取主设备号
int minor = MINOR(nd->i_rdev); //获取次设备号
printk("misc_open,major=%d,minor=%d\n",major,minor);
return 0;
}
static ssize_tmisc_read(struct file *f, char __user *u, size_t sz, loff_t *off)
{
printk("Inthe misc_read() function!\n");
return0;
}
//.owner = THIS_MODULE是指定成员初始化,搜了一下没怎么弄懂怎么回事,先放着,以后再深入研究
//另外俩个设备方法就是read和open了
structfile_operations misc_ops =
{
.owner = THIS_MODULE,
.open = misc_open,
.read = misc_read,
};
//Linux系统使用一个miscdevice结构体来描述结构体
//这是内核中对miscdevice的定义,可以使用source Insight来查看
//在实际使用中,只需要实现次设备号minor、设备名称name、函数操作集fops即可
//MISC_DYNAMIC_MINOR是系统自动配置次设备号
struct miscdevicemisc =
{
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &misc_ops,
};
staticint demo_init(void)
{
intret;
ret = misc_register(&misc);
//misc_register的作用其实是用主标号10调用register_chrdev_region
//具体可以查一下杂项设备的主设备号,在CRT终端上cat /proc/devices就能看到misc的主设备号了
//该方法可以自己创建设备节点,用于联系驱动程序和应用程序
//如果注册成功就返回0,否则返回负数
//该函数的参数是一个名为misc的结构体
printk(DEVICE_NAME"\t initialized %s!\n",(0==ret)?"successed":"failed");
returnret;
}
//misc_deregister()注销杂项设备
static void demo_exit(void)
{
misc_deregister(&misc);
printk("Removing misc_dev...!\n");
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Anmisc device driver as an example");
- 杂项设备的学习
- 杂项设备的实现
- 杂项设备和字符设备的区别
- 个人学习笔记------Linux内核杂项设备
- 学习笔记:Linux杂项设备驱动框架
- 杂项设备
- 杂项设备
- 以杂项设备驱动的方法注册字符设备驱动
- Linux内核学习-misc杂项设备驱动
- misc杂项设备驱动
- 字符杂项设备 misc_register
- 字符杂项设备 misc_register
- 字符杂项设备 misc_register
- 杂项设备miscdevice
- 杂项设备注册 misc_register
- Linux杂项设备驱动
- 杂项设备实现原理
- 杂项设备实现原理
- HTTP 服务器程序
- STM32中GPIO口的8种模式
- 阿里JAVA研发工程师电面一面总结心得
- 安卓设备适配终极杀器-谷歌百分比布局库的使用
- 值语义与对象语义
- 杂项设备的学习
- Github免费账户使用”私有库“
- 小点滴——Matlab小观
- poj3616 动态规划
- JSP引擎 基础概念
- CABasicAnimation animationWithKeyPath
- Unity-Attribute
- 自定义ImageView
- 慕课网——使用Servlet改善Jsp登录页面