字符设备
提供连续的数据流,是一个线性设备,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节/字符来读写数据。举例来说,调制解调器是典型的字符设备。
如:键盘、鼠标、显示屏
块设备
应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘是典型的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。此外,数据的读写只能以块(通常是512B)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。
如:硬盘、U盘
两种设备本身并没用严格的区分,主要是字符设备和块设备驱动程序提供的访问接口(file I/O API)是不一样的
主设备和次设备号:MAJOR MINOR
Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。对于常用设备,Linux有约定俗成的编号,如硬盘的主设备号是3。
一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的各设备。例如一个嵌入式系统,有两个LED指示灯,LED灯需要独立的打开或者关闭。那么,可以写一个LED灯的字符设备驱动程序,可以将其主设备号注册成5号设备,次设备号分别为1和2。这里,次设备号就分别表示两个LED灯。
[zzz@Linuxmg /]$ ll /dev/
crw-rw-rw- 1 root root 1, 3 Jun 7 13:38 null #1主设备号,3次设备号
crw------- 1 root root 10, 144 Jun 7 13:38 nvram #10主设备号,144次设备号
crw------- 1 root root 1, 12 Jun 7 13:38 oldmem
crw-r----- 1 root kmem 1, 4 Jun 7 13:38 port
一般的,主设备号标识出与设备关联的设备驱动。如 /dev/null 和 /dev/port 由 1 号驱动来管理。
现在的 Linux 内核允许多个驱动共享一个主设备号,但更多的设备都遵循一个驱动对一个主设备号的原则。
内核由次设备号确定当前所指向的是哪个设备。根据所编写的驱动程序,可以从内核那里得到一个直接指向设备的指针,或者使用次设备号作为一个设备本地数组的索引。但不论如何,内核自身几乎不知道次设备号的什么事情。
查看设备号
当静态分配设备号时,需要查看系统中已经存在的设备号,从而决定使用哪个新设备号。可以读取/proc/devices文件获得设备的设备号。/proc/devices文件包含字符设备和块设备的设备号,如下所示:
[zzz@Linuxmg /]$ cat /proc/devices #查看字符设备和块设备
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
Block devices:
259 blkext
8 sd
9 md
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
mknod命令
用于创建Linux中的字符设备文件和块设备文件。
man mknod
NAME
mknod - make block or character special files
SYNOPSIS
mknod [OPTION]... NAME TYPE [MAJOR MINOR]
DESCRIPTION
Create the special file NAME of the given TYPE.
Mandatory arguments to long options are mandatory for short options too.
-m, --mode=MODE
set file permission bits to MODE, not a=rw - umask
-Z set the SELinux security context to default type
--context[=CTX]
like -Z, or if CTX is specified then set the SELinux or SMACK security con‐
text to CTX
--help display this help and exit
Both MAJOR and MINOR must be specified when TYPE is b, c, or u, and they must be
omitted when TYPE is p. If MAJOR or MINOR begins with 0x or 0X, it is interpreted
as hexadecimal; otherwise, if it begins with 0, as octal; otherwise, as decimal.
TYPE may be:
b create a block (buffered) special file
c, u create a character (unbuffered) special file
p create a FIFO
主要参数
-Z:设置安全的上下文;
-m:设置权限模式;
FIFO:First Input First Output的缩写,先入先出队列,这是一种传统的按序执行方法,
先进入的指令先完成并引退,跟着才执行第二条指令。
跟去超市买菜差不多,先排队的先结账离开,然后轮到下一个。










网友评论