簡介
在類Unix作業系統中,
設備檔案是一個設備驅動程式的界面,並被存儲在
檔案系統中,就像常規檔案。
設備檔案通常為周邊設備提供簡單的接口,如
印表機。它也可訪問這些設備的特定資源,如硬碟分區。它還可以訪問沒有連線到任何真實設備的
系統資源,如數據接受器和
隨機數生成器。
在類Unix作業系統中包含兩類設備節點,分別為字元檔案與塊檔案。它們的區別是作業系統和硬體如何向它們讀寫數據。它們合稱為
設備特定檔案,與之對應的是
命名管道,它既不連線到任何設備,也不是一個檔案。
MS-DOS的設備檔案借鑑了Unix的特殊檔案的概念。MS-DOS的早期版本並不支持檔案目錄層次,設備檔案的檔案名稱被設定為
保留字以區分普通檔案,新檔案或新目錄不能夠使用這些設備檔案的檔案名稱。
在支持chroot進程獨立的Unix系統(例如Solaris Containers)中,每個chroot環境中常規情況下都需要一個獨立的/dev,它們的掛載點在主機的檔案系統中各種地方顯示。通過限制設備節點只能放入/dev內的chroot實例中,chroot環境可以強制實行硬體隔離(比Unix的
檔案系統許可權還要嚴格的一種
訪問控制,可以禁止特定應用程式訪問或命名硬體)。
MS-DOS通過開放設備檔案的形式保證了設備包含性,應用程式嘗試訪問正在被使用的設備時會無法訪問設備節點。Unix與Linux在
並發控制上採取了多種設備驅動程式的原理。
實現
本質上講,設備節點對應於作業系統分配的資源。Unix通過存放於節點結構中的
主設備號和
從設備號來識別這些資源。在各種
作業系統和
系統平台上,這些數都是被唯一分配的。通常,主數用於指定
驅動程式,而次數用於指定驅動程式控制的某一特定設備(驅動程式可能控制多個設備),在這種情況下,系統可能把次數作為參數傳給驅動程式。
計算機就像對待普通檔案那樣,用標準
系統調用訪問設備節點。根據硬體的接口類型和作業系統處理
輸入輸出的方式,設備檔案可以分成兩類。
設備
字元設備
字元設備是指每次與系統傳輸1個字元的設備。這些設備節點通常為
傳真、
虛擬終端和串口
數據機之類設備提供流通信服務,它通常不支持
隨機存取數據。
字元設備在實現時,大多不使用快取器。系統直接從設備讀取/寫入每一個字元。
塊設備
塊設備是指與系統間用塊的方式移動數據的設備。這些設備節點通常代表可定址設備,如
硬碟、
CD-ROM和
記憶體區域。
塊設備通常支持
隨機存取和定址,並使用快取器。作業系統為輸入輸出分配了快取以存儲一塊數據。當程式向設備傳送了讀取或者寫入數據的請求時,系統把數據中的每一個字元存儲在適當的快取中。當快取被填滿時,會採取適當的操作(把數據傳走),而後系統清空快取。
偽設備
在類Unix作業系統中,設備節點並不一定要對應物理設備。沒有這種對應關係的設備是偽設備。作業系統運用了它們提供的多種功能。部分經常使用到的偽設備包括:
創建節點
節點是由mknod系統調用創建的。在命令行中,有同名的程式來創建節點。rename和unlink系統調用可以用於移動和刪除節點,相應的命令是mv和rm。在使用cp命令時加上-R或-a參數,可以創建一個與原設備節點具有同樣屬性的節點。
命名約定
在基於Linux的系統中,設備節點一般在/dev下,通常使用如下的前綴:
fb:frame緩衝
pt:偽終端
scd:SCSI音頻光碟機
sd:SCSI硬碟
sg:SCSI通用設備
sr:SCSI數據光碟機
大部分設備的前綴名後面跟隨一個數字,它唯一指定某一設備。硬碟驅動器的前綴名後面跟隨一個字母和一個數字,字母用於指明設備,而數字用於指明分區。因此,/dev/sda3指定了硬碟上的一個分區,/dev/pts/14指定了一個網路終端會話。
一些Linux發行版用SCSI層訪問所有固定硬碟,因此雖然一塊硬碟可能並不是SCSI硬碟,但仍可以通過sd設備訪問它。