在Linux设备驱动开发中,粗略的将设备分为三种类型:字符设备,块设备和网络设备。
1、字符设备:指能够像字节流串行顺序依次进行访问的设备,对它的读写是以字节为单位。字符设备的上层没有磁盘文件系统,所以字符设备的file_operations成员函数就直接由字符设备驱动提供(一般字符设备都会实现相应的fops集),因此file_operations 也就成为了字符设备驱动的核心。
类型举例:鼠标,键盘,串口,控制台,LED
2、块设备:以数据块的形式存放数据,如NAND Flash以页为单位存储数据,并采用mount方式挂载块设备。
块设备必须能够随机存取(random access),字符设备则没有这个要求。
块设备除了给内核提供和字符设备一样的接口外,还提供了专门面向块设备的接口,块设备的接口必须支持挂装文件系统,通过此接口,块设备能够容纳文件系统,因此应用程序一般通过文件系统来访问块设备上的内容,而不是直接和设备打交道。
对于块设备而言,上层ext2,jiffs2,fat等文件系统会 实现针对VFS的file_opertations成员函数,所以设备驱动层将看不到file_opeations的存在。磁盘文件系统和设备驱动会将对磁盘上文件的访问转换成对磁盘上柱面和扇区的访问。
类型举例:硬盘,磁盘,U盘,SD卡
3、网络设备在Linux内核中是唯一不体现一切皆设备思想的驱动架构,因为网络设备使用套接字来实现网数据的接受和发送。
网络设备驱动不同于字符设备和块设备,不在/dev下以文件节点代表,而是通过单独的网络接口来代表。
类型举例:网卡
原帖参见:https://blog.csdn.net/u012247418/article/details/103332915