設備文件系統
設備文件在類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.