设备驱动程序用于与系统连接的输入/输出装置通信,如硬盘、软驱、各种接口、声卡等。按照经典的UNIX箴言“万物皆文件”(everything is a file),对外设的访问可利用/dev目录下的设备文件来完成,程序对设备的处理完全类似于常规的文件。设备驱动程序的任务在于支持应用程序经由设备文件与设备通信。换言之,使得能够按适当的方式在设备上读取/写入数据。
外设可分为以下两类。
(1)字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据。举例来说,调制解调器是典型的字符设备。
(2)块设备:应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。此外,数据的读写只能以块(通常是512B)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。
编写块设备的驱动程序比字符设备要复杂得多,因为内核为提高系统性能广泛地使用了缓存机制。
| 块设备 | 字符设备 |
|---|---|
| 支持随机读 | 不支持随机读 ,支持顺序读 |
| 硬盘 | 调制解调器 |
| 基于块倍数(512B)进行读写寻址 | 基于字符 |
区别划分点:块设备寻址基于块,字符设备基于字符,块设备代表有硬盘,字符设备代表调制解调器,块设备支持随机读,字符设备只支持顺序读。
参考:《深入linux内核框架》