Linux设备驱动分类
驱动分为有操作系统设备驱动和误操作系统的设备驱动。
有无操作系统设备驱动
无操作系统设备驱动
不是所有的计算机系统都一定要有操作系统,在许多情况下,操作系统都是不必存在的。对于功能比较单一、控制不复杂的系统,如ASIC,公交卡刷卡机、洗衣机、电话,并不需要多任务调度、文件系统、内存管理等复杂功能,用单任务架构完全可以良好支撑它们的工作。
一个无限循环中夹杂着对设备中断的检测或者对设备的轮询,是该类驱动的典型架构。
——《Linux设备驱动开发详解 宋宝华》第一章 p5
原书该章节有对此类驱动框架有举例。
有操作系统的设备驱动
在有操作系统的系统里,设备驱动在无操作系统时的硬件操作工作必不可少,与此同时还需要将驱动融入到内核中,为了融入内核,必须在所有设备驱动中设计面向操作系统内核接口,这样的接口由操作系统决定。
由此可见,设备驱动变成了连接硬件和内核的桥梁。操作系统的存在势必要求设备驱动附加更多的代码和功能,把单一的“硬件设备行动”变成了操作系统内和硬件交互的模块,对外呈现为操作系统API,不再给应用工程师直接接口。
内核的可并发,内存管理使得设备驱动可以完成更加复杂、多样性的任务。操作系统带给设备驱动的麻烦,将使得上层应用更加便捷的调用底层——当驱动都按照操作系统给出的独立于设备的接口而设计,应用程序将可使用统一的系统调用接口来访问各种设备。对于类Unix的Linux,应用程序通过read()、write()等函数读写文件就可以访问各种字符设备和块设备。
Linux设备驱动
驱动主要分为以下三类:
- 字符设备驱动
- 块设备驱动
- 网络驱动
1.字符设备驱动
字符设备指那些必须以串行顺序依次进行访问的设备。它们是我们日常最常见的驱动了,像鼠标、键盘、打印机、触摸屏,还有点灯以及I2C、SPI、音视频都属于字符设备驱动。
字符设备不经过系统快速缓冲。
2.块设备驱动
就是存储器设备的驱动,比如 EMMC
、NAND
、SD 卡
和 U 盘
等存储设备,因为这些存储设备的特点是以存储块为基础,可以用任意顺序进行访问,以块为单位进行操作,因此叫做块设备。
块设备经过设备缓冲
3.网络设备驱动
就是网络驱动,不管是有线的还是无线的,都属于网络设备驱动的范畴。
网络设备面向数据包的接受和发送而设计,它并不对应文件系统的节点
注意:
块设备和网络设备驱动要比字符设备驱动复杂,就是因为其复杂所以半导体厂商一般都给我们编写好了,大多数情况下都是直接可以使用的。
一个设备可以属于多种设备驱动类型,比如USB WIFI
,其使用 USB 接口,所以属于字符设备,但是其又能上网,所以也属于网络设备驱动。
Linux设备驱动与整个软硬件系统的关系
如下图,除网络设备外,字符设备和块设备都被映射到Linux文件系统的文件和目录。通过高文件系统的系统调用接口open()
、write()
、read()
、close()
等即可访问字符设备和块设备。所有的字符设备和块设备都被统一的呈现给用户。