一、字符设备
1、字符设备以字节为单位。大多数设备是字符设备,因为他们不需要缓冲而且不以固定块大小进行操作。
2、字符设备无需缓冲直接读写。
3、字符设备只能被顺序读写。
二、块设备
1、块设备只能以块为单位接受输入和输出。
2、块设备对I/0请求有对应的缓冲区,因此他们可以选择以什么样的顺序进行响应。对于存储设备而言,调整读写的顺序作用巨大,因为读写连续的扇区的读写速度比分离的扇区更快。
3、块设备可以随机访问。
4、块设备工作于VFS(虚拟文件系统)之下。
总结:
快设备的I/O操作方式与字符设备存在较大的不同,因而引入了request_queue、request、bio等一系列数据结构。在整个块涉笔的I/O操作中,贯穿始终的就是“请求”,字符设备的I/O操作则是直接进行不绕弯,块设备的I/O 操作会排队和整合。
驱动的任务是处理请求,对请求的排列和整合由I/O调度算法解决,因此块设备的核心就是处理请求处理函数或“制造请求”函数。
尽管在块设备驱动中仍然存在block_device_operations结构体及其成员函数,但不再包括读写类的成员函数,而只是包含打开、释放及IO控制等与具体读写无关的函数。
块设备驱动的结构相对复杂,但幸运的是,块设备不像字符设备那样包罗万象,它通常就是存储设备,而且驱动的主体已经有linux内核提供,针对一个稳定的硬件系统,驱动工程师所涉及的工作只是编写极其少量的与硬件平台相关的代码。
三、网络设备
网络设备是完成用户数据包在网络媒介上发送和接受的设备,它将上层协议传递下来的数据包以特定的媒介访问控制方式进行发送,并将接受到的数据包传递给上层协议。
与字符设备和块设备不同,网络设备并不对应于/dev目录下的文件,应用程序最终使用套接字完成与网络设备的接口。因而在网络设备身上并不能体现出“一切都是文件”的思想。
Linux对网络设备驱动定义了4个层次,这4个层次为网络协议接口层、网络设备接口层、提供实际功能的设备驱动功能层和网络设备与媒介层。