Linux杂项设备与字符设备

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux杂项设备与字符设备相关的知识,希望对你有一定的参考价值。

.1 杂项设备驱动的引入

 

字符设备指那些必须以串行顺序依次进行访问,且没有经过系统快速缓冲的设备,了解了Linux内核中驱动的框架和组成,以及编写的步骤等。但是,当我们写的驱动程序多了之后,就会发现:部分硬件并不符合预先定义的字符设备的范畴,而且普通字符设备的主设备号不管是静态分配还是动态分配,都会消耗一个主设备号(目前一个系统最多只能有255个字符设备),比较浪费主设备号资源。因此,而引入了杂项设备驱动。

杂项设备是一个典型的字符设备(与接下来要介绍的输入子系统一样,呵呵),其主设备号固定为10。其内部实现就是用主设备号10来调用register_chrdev()实现的;并且在内部还调用了class_create()和device_create ()为每个杂项设备创建设备节点,从而避免了我们通过mknod命令或自行调用该两个函数来创建设备节点的麻烦。

从以上这点来说,杂项设备就是将我们平常编写字符设备的驱动进行了再次封装,降低了我们编写字符设备驱动的难度,同时节约了主设备号资源。

 

.3 杂项设备与字符设备实现比较

在进行字符设备驱动程序开发的过程中,我们的实现步骤如下:

 申请一个字符设备号:可以自己指定,也可系统自动分配;

 构造一个file_operations结构体,其包含对硬件的所有操作;

 实现file_operations结构体中的成员函数;

 将字符设备注册进系统中:register_chrdev();

 创建设备类和设备节点:class_create()、device_create();

 告诉内核入口与出口函数:module_init()、module_exit();

杂项设备驱动也是字符设备驱动,那么其注册的过程与字符设备驱动一样,也必须经过上面的这些步骤,只是杂项设备驱动中的对申请字符设备号、注册字符设备到系统、创建设备类和设备节点进行了封装,我们只需要完成如下几步开发即可:

 构造一个file_operations结构体,其中包含对硬件的所有操作;

实现file_operations结构体中的成员函数;

 构造一个杂项设备驱动(struct miscdevice)实体,并赋值前面定义的file_operations实体;

 在入口函数处调用misc_register()向系统注册杂项设备;

 在出口函数处调用misc_deregister()从系统注销杂项设备;

 告诉内核入口与出口函数:module_init()、module_exit();

从中也可以得出一个结论:无论Linux内核对驱动框架设计的如何好,内核实现了多少的代码,与硬件相关部分的代码还是需要我们去实现。

以上是关于Linux杂项设备与字符设备的主要内容,如果未能解决你的问题,请参考以下文章

Linux驱动开发: 杂项字符设备

Linux驱动开发: 杂项字符设备

Linux-标准字符设备

Linux-标准字符设备

9Linux驱动的杂项设备

Linux-设备节点文件创建函数