设备文件
Linux系统中将外部设备视为一个文件来管理,设备文件被保存在系统中的/dev目录下。将设备抽象为文件的好处是:应用程序可以使用与操作普通文件一样的方式,对设备文件执行打开、关闭和读写等操作。比如查看属性信息时,无论是普通文件还是设备,都可以使用“ls –l”命令。
使用“ls –l /dev”命令查看设备文件的详细信息,则在屏幕上会打印如下信息:
……
crw-rw-rw-. 1 root tty 5, 0 Nov 11 10:47 tty
crw--w----. 1 root tty 4, 0 Nov 11 10:47 tty0
crw--w----. 1 root tty 4, 1 Nov 11 10:47 tty1
crw--w----. 1 root tty 4, 10 Nov 11 10:47 tty10
……
以上为/dev目录下部分设备文件的详细信息。与普通文件相同,设备文件的详细信息也分为7项,普通文件的第五项信息表示文件大小,但设备文件的第五项,是由“,”分割的两个数字,这两个数字分别表示设备的主设备号(major number)和次设备号(minor number)。
设备文件的主设备号标识设备的类型,次设备号标识属于同一设备类型的不同设备。系统在引用设备时,通过设备文件的主设备号和次设备号实现引用。设备文件没有数据块,它最重要的信息就是主、次设备号,这两项信息存储在设备文件的inode中。
Linux中设备分为三类:字符设备、块设备和网络设备。网络设备通过socket调用,此处主要讲解字符设备和块设备。
字符设备提供连续的数据流,应用程序可以从字符设备中顺序读取数据,常见的字符设备有键盘、打印机、绘图仪等,此类设备通常不支持随机存取,而是按字节为单位来读写数据;块设备的读写以块的倍数为单位进行,它支持数据的随机访问,应用程序可自行确定读取位置,本章第一节中学习的磁盘,就是典型的块设备。
Linux将块设备和字符设备分别视为块设备文件和字符设备文件,在属性信息中,它们的文件类型分别用字符b和字符c来表示。字符设备和块设备的驱动程序设计差异较大,但Linux的文件系统通过一个结构体file_operations,为它们实现了接口的统一。file_operations结构体中定义在头文件linux/fs.h中,该结构体中存储了驱动内核模块提供的对设备进行各种操作的函数指针。