第一章 Linux设备管理概述 1.1 设备分类 在Linux系统中,对设备的管理有其自身的特点:对所有的硬件设备进行了抽象,使得计算机用户对硬件设备的操作与对文件的操作十分相似,可以通过与操作文件完全一样的标准系统调用来打开、关闭、读和写设备。 Linux将所有的硬件设备被归结为三类: 字符设备: 字符设备指无需缓冲就可以直接读写的设备。用户可以像访问文件一样访问字符设备,字符设备驱动程序负责实现这些访问操作。驱动程序通常会实现open,close,read和write系统调用。键盘和鼠标就是字符设备的典型例子。通过文件系统节点可以访问字符设备,例如/dev/tty1和/dev/lp1。字符设备和普通文件系统间的显著区别是:普通文件允许在其上来回读写,而大多数字符设备仅仅是数据通道,只能顺序读写。当然,也存在这样的字符设备,看起来像是个数据区,可以来回读取其中的数据。 块设备: 块设备是文件系统的宿主,如硬盘、光驱、软驱等。在大多数Unix系统中,只能将块设备看作多个块进行访问,一个块通常是1KB字节数据。Linux允许用户像字符设备那样读取块设备--允许一次传输任意数目的字节。块设备和字符设备只在内核内部的管理上有所区别,因此也就是在内核/驱动程序间的软件接口上有所区别。就像字符设备一样,每个块设备也通过文件系统节点来读写数据,它们之间的不同对用户来说是透明的。块设备驱动程序和内核的接口与字符设备驱动程序的接口是一样的,它也是通过一个传统的面向块的接口与内核通信,但这个接口对用户来说是不可见的。 网络设备: 网络设备与字符设备和块设备最大的不同之处就在于网络设备没有对应的设备文件。网卡是最典型的一个例子。 网卡把向外发送的数据写入通往远程计算机系统的一条通信线路上,把从远程系统中接受到的报文装入内核内存。在Unix系统中,计算机为每个网卡分配一个不同的符号名,例如:eth0,eth1等。然而这个名字并没有对应的设备文件,也没有对应的索引节点。 由于没有使用文件系统,所以系统管理员必须建立设备名和网络地址之间的联系。因此,应用程序和网络接口之间的数据通信不是基于标准的有关文件的read()、write()等系统调用,而是基于socket()、bind()、listen()、accept()、connect()系统调用,这些系统调用对网络地址进行操作。 1.2 主设备号和次设备号 传统方式的设备管理中,除了设备类型(字符设备或块设备)以外,内核还需要一对称作主、次设备号的参数来唯一标识一个设备。主设备号标识设备对应的驱动程序,内核利用主设备号将设备与对应的驱动程序对应起来。次设备号只由设备驱动程序使用,内核的其他部分不使用它。一个驱动程序可以控制若干个设备,次设备号可将使用同一驱动程序的不同设备区分开来。 所有设备在适当的目录(通常在/dev目录下)下必须有相应的特殊文件,这样字符设备和块设备都可以通过文件操作完成系统调用了。设备文件是特殊文件,这一点可以通过命令“ls -l”输出的第一列中的“c”标明,它说明它们是字符节点;块设备的第一列是“b”。在执行了“ls -l”命令之后,在设备文件条目的最新修改日期前可看到两个数(用逗号分隔),这个位置通常显示常规文件的长度。这两个数就是相应设备的主设备号和次设备号。下面列表显示了我使用的系统上的一些设备,它们的主设备号分别是10、14、29、41、68,而次设备号是3、4、20、7、0、1、2。
(出处:http://www.sheup.com)