字符設(shè)備
提供連續(xù)的數(shù)據(jù)流,是一個線性設(shè)備怎顾,應(yīng)用程序可以順序讀取,通常不支持隨機存取漱贱。相反槐雾,此類設(shè)備支持按字節(jié)/字符來讀寫數(shù)據(jù)。舉例來說幅狮,調(diào)制解調(diào)器是典型的字符設(shè)備募强。
如:鍵盤、鼠標崇摄、顯示屏
塊設(shè)備
應(yīng)用程序可以隨機訪問設(shè)備數(shù)據(jù)擎值,程序可自行確定讀取數(shù)據(jù)的位置。硬盤是典型的塊設(shè)備逐抑,應(yīng)用程序可以尋址磁盤上的任何位置鸠儿,并由此讀取數(shù)據(jù)。此外厕氨,數(shù)據(jù)的讀寫只能以塊(通常是512B)的倍數(shù)進行进每。與字符設(shè)備不同,塊設(shè)備并不支持基于字符的尋址命斧。
如:硬盤田晚、U盤
兩種設(shè)備本身并沒用嚴格的區(qū)分,主要是字符設(shè)備和塊設(shè)備驅(qū)動程序提供的訪問接口(file I/O API)是不一樣的
主設(shè)備和次設(shè)備號:MAJOR MINOR
Linux的設(shè)備管理是和文件系統(tǒng)緊密結(jié)合的国葬,各種設(shè)備都以文件的形式存放在/dev目錄下贤徒,稱為設(shè)備文件芹壕。應(yīng)用程序可以打開、關(guān)閉和讀寫這些設(shè)備文件接奈,完成對設(shè)備的操作踢涌,就像操作普通的數(shù)據(jù)文件一樣。為了管理這些設(shè)備鲫趁,系統(tǒng)為設(shè)備編了號斯嚎,每個設(shè)備號又分為主設(shè)備號和次設(shè)備號。主設(shè)備號用來區(qū)分不同種類的設(shè)備挨厚,而次設(shè)備號用來區(qū)分同一類型的多個設(shè)備堡僻。
對于常用設(shè)備,Linux有約定俗成的編號疫剃,如硬盤的主設(shè)備號是3钉疫。
一個字符設(shè)備或者塊設(shè)備都有一個主設(shè)備號和次設(shè)備號。主設(shè)備號和次設(shè)備號統(tǒng)稱為設(shè)備號巢价。主設(shè)備號用來表示一個特定的驅(qū)動程序牲阁。次設(shè)備號用來表示使用該驅(qū)動程序的各設(shè)備。
例如一個嵌入式系統(tǒng)壤躲,有兩個LED指示燈城菊,LED燈需要獨立的打開或者關(guān)閉。那么碉克,可以寫一個LED燈的字符設(shè)備驅(qū)動程序凌唬,可以將其主設(shè)備號注冊成5號設(shè)備,次設(shè)備號分別為1和2漏麦。這里客税,次設(shè)備號就分別表示兩個LED燈。
[zzz@Linuxmg /]$ ll /dev/
crw-rw-rw- 1 root root 1, 3 Jun 7 13:38 null #1主設(shè)備號撕贞,3次設(shè)備號
crw------- 1 root root 10, 144 Jun 7 13:38 nvram #10主設(shè)備號更耻,144次設(shè)備號
crw------- 1 root root 1, 12 Jun 7 13:38 oldmem
crw-r----- 1 root kmem 1, 4 Jun 7 13:38 port
一般的,主設(shè)備號標識出與設(shè)備關(guān)聯(lián)的設(shè)備驅(qū)動
捏膨。如 /dev/null 和 /dev/port 由 1 號驅(qū)動來管理秧均。
現(xiàn)在的 Linux 內(nèi)核允許多個驅(qū)動共享一個主設(shè)備號,但更多的設(shè)備都遵循一個驅(qū)動對一個主設(shè)備號的原則号涯。
內(nèi)核由次設(shè)備號確定當前所指向的是哪個設(shè)備熬北。
根據(jù)所編寫的驅(qū)動程序,可以從內(nèi)核那里得到一個直接指向設(shè)備的指針诚隙,或者使用次設(shè)備號作為一個設(shè)備本地數(shù)組的索引讶隐。但不論如何,內(nèi)核自身幾乎不知道次設(shè)備號的什么事情久又。
查看設(shè)備號
當靜態(tài)分配設(shè)備號時巫延,需要查看系統(tǒng)中已經(jīng)存在的設(shè)備號效五,從而決定使用哪個新設(shè)備號÷澹可以讀取/proc/devices文件獲得設(shè)備的設(shè)備號畏妖。/proc/devices文件包含字符設(shè)備和塊設(shè)備的設(shè)備號,如下所示:
[zzz@Linuxmg /]$ cat /proc/devices #查看字符設(shè)備和塊設(shè)備
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命令
用于創(chuàng)建Linux中的字符設(shè)備文件和塊設(shè)備文件疼阔。
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
主要參數(shù)
-Z:設(shè)置安全的上下文戒劫;
-m:設(shè)置權(quán)限模式;
FIFO:First Input First Output的縮寫婆廊,先入先出隊列迅细,這是一種傳統(tǒng)的按序執(zhí)行方法,
先進入的指令先完成并引退淘邻,跟著才執(zhí)行第二條指令茵典。
跟去超市買菜差不多,先排隊的先結(jié)賬離開宾舅,然后輪到下一個统阿。