Ⅰ 字元設備和塊設備
提供連續的數據流,是一個線性設備,應用程序可以順序讀取,通常不支持隨機存取。相反,此類設備支持按位元組/字元來讀寫數據。舉例來說,數據機是典型的字元設備。
如:鍵盤、滑鼠、顯示屏
應用程序可以隨機訪問設備數據,程序可自行確定讀取數據的位置。硬碟是典型的塊設備,應用程序可以定址磁碟上的任何位置,並由此讀取數據。此外,數據的讀寫只能以塊(通常是512B)的倍數進行。與字元設備不同,塊設備並不支持基於字元的定址。
如:硬碟、U盤
兩種設備本身並沒用嚴格的區分,主要是字元設備和塊設備驅動程序提供的訪問介面(file I/O API)是不一樣的
Linux的設備管理是和文件系統緊密結合的,各種設備都以文件的形式存放在/dev目錄下,稱為設備文件。應用程序可以打開、關閉和讀寫這些設備文件,完成對設備的操作,就像操作普通的數據文件一樣。為了管理這些設備,系統為設備編了號,每個設備號又分為主設備號和次設備號。 主設備號用來區分不同種類的設備,而次設備號用來區分同一類型的多個設備。 對於常用設備,Linux有約定俗成的編號,如硬碟的主設備號是3。
一個字元設備或者塊設備都有一個主設備號和次設備號。主設備號和次設備號統稱為設備號。主設備號用來表示一個特定的驅動程序。次設備號用來表示使用該驅動程序的各設備。 例如一個嵌入式系統,有兩個LED指示燈,LED燈需要獨立的打開或者關閉。那麼,可以寫一個LED燈的字元設備驅動程序,可以將其主設備號注冊成5號設備,次設備號分別為1和2。這里,次設備號就分別表示兩個LED燈。
一般的, 主設備號標識出與設備關聯的設備驅動 。如 /dev/null 和 /dev/port 由 1 號驅動來管理。
現在的 Linux 內核允許多個驅動共享一個主設備號,但更多的設備都遵循一個驅動對一個主設備號的原則。
內核由 次設備號確定當前所指向的是哪個設備。 根據所編寫的驅動程序,可以從內核那裡得到一個直接指向設備的指針,或者使用次設備號作為一個設備本地數組的索引。但不論如何,內核自身幾乎不知道次設備號的什麼事情。
當靜態分配設備號時,需要查看系統中已經存在的設備號,從而決定使用哪個新設備號。可以讀取/proc/devices文件獲得設備的設備號。/proc/devices文件包含字元設備和塊設備的設備號,如下所示:
用於創建Linux中的字元設備文件和塊設備文件。