裝置檔案系統
裝置檔案在類Unix系統中是一個裝置驅動程式的介面,並如常規檔案一樣出現在檔案系統中。
在微軟的MS-DOS、OS-2和Windows等作業系統中也有專門的裝置檔案。它們允許應用程式使用裝置驅動程式,通過標準輸入輸出系統呼叫與驅動程式互動,從而簡化了許多工,也帶來了與裝置特性、功能無關的使用者級I/O。
裝置檔案通常為周邊裝置提供簡單的介面,如印表機。它也可訪問這些裝置的特定資源,如硬碟分割區。它還可以訪問沒有連接到任何真實裝置的系統資源,如資料接受器和亂數生成器。
在類Unix作業系統中包含兩類裝置節點,分別為字元檔案與塊檔案。它們的區別是作業系統和硬體如何向它們讀寫資料。它們合稱為裝置特定檔案,與之對應的是命名管道,它既不連接到任何裝置,也不是一個檔案。
MS-DOS的裝置檔案借鑑了Unix的特殊檔案的概念。MS-DOS的早期版本並不支援檔案目錄層次,裝置檔案的檔名被設定為保留字以區分普通檔案,新檔案或新目錄不能夠使用這些裝置檔案的檔名。
在支援chroot行程獨立的Unix系統(例如Solaris Containers)中,每個chroot環境中常規情況下都需要一個獨立的/dev,它們的掛載點在主機的檔案系統中各種地方顯示。通過限制裝置節點只能放入/dev內的chroot實例中,chroot環境可以強制實行硬體隔離(比Unix的檔案系統權限還要嚴格的一種訪問控制,可以禁止特定應用程式訪問或命名硬體)。
MS-DOS通過開放裝置檔案的形式保證了裝置包含性,應用程式嘗試訪問正在被使用的裝置時會無法訪問裝置節點。Unix與Linux在並行控制上採取了多種裝置驅動程式的原理。[1]
實現
本質上講,裝置節點對應於作業系統分配的資源。Unix通過存放於節點結構中的主裝置號和從裝置號來辨識這些資源。在各種作業系統和系統平台上,這些數都是被唯一分配的。通常,主數用於指定驅動程式,而次數用於指定驅動程式控制的某一特定裝置(驅動程式可能控制多個裝置),在這種情況下,系統可能把次數作為參數傳給驅動程式。
電腦就像對待普通檔案那樣,用標準系統呼叫訪問裝置節點。根據硬體的介面類型和作業系統處理輸入輸出的方式,裝置檔案可以分成兩類。
裝置
字元裝置
字元裝置是指每次與系統傳輸1個字元的裝置。這些裝置節點通常為傳真、虛擬終端和序列埠數據機之類裝置提供流通訊服務,它通常不支援隨機存取資料。
字元裝置在實現時,大多不使用快取記憶體。系統直接從裝置讀取/寫入每一個字元。
塊裝置
塊裝置是指與系統間用塊的方式行動資料的裝置。這些裝置節點通常代表可定址裝置,如硬碟、CD-ROM和主記憶體區域。
塊裝置通常支援隨機存取和定址,並使用快取記憶體。作業系統為輸入輸出分配了快取以儲存一塊資料。當程式向裝置傳送了讀取或者寫入資料的請求時,系統把資料中的每一個字元儲存在適當的快取中。當快取被填滿時,會採取適當的操作(把資料傳走),而後系統清空快取。
偽裝置
在類Unix作業系統中,裝置節點並不一定要對應物理裝置。沒有這種對應關係的裝置是偽裝置。作業系統運用了它們提供的多種功能。部份經常使用到的偽裝置包括:
/dev/null
- 接受並丟棄所有輸入;即不產生任何輸出。
/dev/full
- 永遠在被填滿狀態的裝置。
/dev/loop
- Loop裝置
/dev/zero
- 產生連續的NUL字元的串流(數值為0)。
/dev/random
- 產生一個虛假隨機的任意長度字元串流。(Blocking)
/dev/urandom
- 產生一個虛假隨機的任意長度字元串流。(Non-Blocking)
建立節點
節點是由mknod系統呼叫建立的。在命令列中,有同名的程式來建立節點。rename和unlink系統呼叫可以用於移動和刪除節點,相應的命令是mv和rm。在使用cp命令時加上-R
或-a
參數,可以建立一個與原裝置節點具有同樣屬性的節點。
命名約定
在基於Linux的系統中,裝置節點一般在/dev
下,通常使用如下的字首:
- fb:frame緩衝
- fd:軟碟
- hd:IDE硬碟或光碟機
- lp:印表機
- par:並列埠
- pt:偽終端
- s:SCSI裝置
- scd:SCSI音訊光碟機
- sd:SCSI硬碟
- sg:SCSI通用裝置
- sr:SCSI資料光碟機
- st:SCSI磁帶
- tty:終端
- ttyS:序列埠
大部分裝置的字首名後面跟隨一個數字,它唯一指定某一裝置。硬碟機的字首名後面跟隨一個字母和一個數字,字母用於指明裝置,而數字用於指明分割區。因此,/dev/sda3
指定了硬碟上的一個分割區,/dev/pts/14
指定了一個網路終端對談。
一些Linux發行版用SCSI層來定義非IDE硬碟的硬碟裝置,例如SATA硬碟、USB磁碟等,因此雖然一塊硬碟可能並不是SCSI硬碟,但仍可以通過sd
裝置訪問它。
參考資料
- ^ (英文)Corbet, Jonathan; Kroah-Hartman, Greg; Rubini, Alessandro. Linux Device Drivers, 3rd Edition. O'Reilly. 2005 [2018-04-30]. (原始內容存檔於2017-09-22).
The next step beyond a single-open device is to let a single user open a device in multiple processes but allow only one user to have the device open at a time.