文章目录
1. Linux设备分类
Linux 系统中的设备可以分为字符设备、块设备和网络设备这3 类。
字符设备:字符设备是能够像字节流一样被访问的设备,当对字符设备发出读写请求,相应的I/O 操作立即发生。Linux 系统中很多设备都是字符设备,如字符终端、串口、键盘、鼠标等。在嵌入式Linux 开发中,接触最多的就是字符设备以及驱动。
块设备:块设备是Linux 系统中进行I/O 操作时必须以块为单位进行访问的设备,块设备能够安装文件系统。块设备驱动会利用一块系统内存作为缓冲区,因此对块设备发出读写访问,并不一定立即产生硬件I/O 操作。Linux 系统中常见的块设备有如硬盘、软驱等等。
网络设备:网络设备既可以是网卡这样的硬件设备,也可以是一个纯软件设备如回环设备。网络设备由Linux的网络子系统驱动,负责数据包的发送和接收,而不是面向流设备,因此在Linux系统文件系统中网络设备没有节点。对网络设备的访问是通过socket调用产生,而不是普通的文件操作如open/close 和read/write 等。
2. 设备编号
设备编号由主和从构成。在Linux内核中,使用dev_t类型来保存设备编号。在 2.62.6 版本的linux 内核中,
dev_t
是一个 32 位数,高 12 位是主设备号,低 20位是次设备号。
主设备号标识对应的驱动程序,告诉Linux内核使用哪个驱动程序该设备。如果多个设备使用同一驱动程序,则它们拥有相的主号。例如/dev/ttyS0~3这 4个设备,拥有相同的主设备号4,说明它们使用同一份驱动:
$ ls -l /dev/ttyS*
crw-rw---- 1 root dialout 4, 64 2001-01-07 17:48 /dev/ttyS0
crw-rw---- 1 root dialout 4, 65 2001-01-07 17:48 /dev/ttyS1
crw-rw---- 1 root dialout 4, 66 2001-01-07 17:48 /dev/ttyS2
crw-rw---- 1 root dialout 4, 67 2001-01-07 17:48 /dev/ttyS3
主设备号由系统来维护,尽管尽管Linux2.6可以容纳大量的 设备,但是在使用主设备号时候, 注意一定不要使用系统已经使用的主设备号。当前运系统占了哪些主设备号通过/proc/devices文件查看。
# cat /proc/devices
Character devices:
1 mem
4 /dev/vc/0
5 /dev/tty
5 /dev/console
7 vcs
10 misc
13 input
14 sound
29 fb
90 mtd
116 alsa
180 usb
189 usb_devi
252 usbmon
253 ubi0
254 rtc
Block devices:
7 loop
31 mtdblock
65 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
从设备号也称次,用于确定该文件所指的。如果一个驱动可以驱动一组相似的设备,此时就需要依赖于次设备号对这些外进行区分。 动一组相似的设备,此时就需要依赖于次号对这些外进行区分。 动一组相似的设备,此时就需要依赖于次号对这些外进行区分。
获取一个设备的编号,应当使用
中定义的 宏,而不应当对设备号位数和表述结构做任何假设,因为这样会导致不兼容以前的内核或者未来版本备号和表述方式发生变化。例如获取一个设备 和表述方式发生变化。例如获取一个设备 和表述方式发生变化。例如获取一个设备 和表述方式发生变化。例如获取一个设备 和表述方式发生变化。例如获取一个设备 和表述方式发生变化。例如获取一个设备 dev 的主次设备号,可用:
MAJOR(dev_t dev);
MINOR(dev_t dev);
如果已知一个设备的主次号,要转换成
dev_t
类型的设备编号,则应当使用:
MKDEV(int major, minor);
3. 设备节点
设备(包括硬件设备)在Linux 系统下,表现为设备节点,也称设备文件。设备文件是一种特殊的文件,它们存储在文件系统中(通常在/dev 目录下),但它们仅占用文件目录项而不涉及存储数据。事实上,它们仅仅记录了其所属的设备类别、主设备号和从设备号等设
备相关信息。
来看两个典型的设备文件的详细信息:
$ ls -l /dev/ttyS0 /dev/sda1
brw-rw---- 1 root disk 8, 1 2011-01-07 17:48 /dev/sda1
crw-rw---- 1 root dialout 4, 64 2011-01-07 17:48 /dev/ttyS0
以/dev/ttyS0 的信息为例,该设备节点对应于系统的串口:
/dev/ttyS0
是设备节点名称。
c
表示该设备是字符。
- 主设备主号为
4
,从设备号为 64
。
设备分为字符设备、块设备和网络设备,而网络设备没有设备节点,所以设备文件基本上就分为字符文件和块设两类,在节点属性中分别以 备文件和块设两类,在设备节点属性中分别以 c
和b
来表示,即c
表示字符设备节点文件,b
表示块设备节点文件。
当程序打开一个设备文件时,内核就可以获取对应设备的设备类型、主设备号和次设备号信息,内核也就知道了程序需要操作使用哪个设备驱动。在随后对这文件的操作都会调用相应的驱动程序函数,同时把从设备号传递给驱动程序。