1)字符设备
字符设备是能够像字节流(比如文件)一样访问的设备,由字符设备驱动从程序来实现这种特性,通过/dev下的字符设备文件来访问。字符设备驱动程序通常至少需要实现open、close、read和write等系统调用所对应的、对该硬件进行操作的功能函数。
应用程序调用system call,将会导致操作系统执行上层功能组件的代码,这些代码会处理内核的一些内部事务,为操作硬件做好准备,然后就会调用驱动程序中实现的对硬件进行物理操作的函数,从而完成对硬件的驱动,然后返回操作系统上层功能组件的代码,做好内核内部的善后事务,后返回应用程序。
由于应用程序必须使用/dev/目录下的设备文件,所以该设备文件必须事先创建。
2)块设备
块设备通常是按照块为单位来访问数据,比如一块为512KB。
块设备也是通过/dev目录下的文件系统节点来访问,块设备和字符设备区别仅仅在于内核内部管理数据的方式,也就是内核和驱动程序的接口不同。
块设备除了给内核提供和字符设备一样的接口外,还提供了专门面向块设备的接口,块设备的接口必须支持挂装文件系统,通过此接口,块设备能够容纳文件系统,因此应用程序一般通过文件系统来访问块设备上的内容,而不是直接和设备打交道。
3)网络设备
网络设备驱动不同于字符设备和块设备,不在/dev下以文件节点代表,而是通过单独的网络接口来代表。
任何网络事务都要通过一个网络接口,即一个能够和其他主机交换数据的设备,通过接口代表一个硬件设备,但也可能是个纯软件设备。
内核和网络驱动程序间的通信完全不同于内核和字符设备驱动以及块设备前驱动程序之间的通信,内核调用一套与数据包传输相关的函数。