在linux中,裝置檔案是裝置驅動程式的接口,允許應用程式透過標準輸入輸出系統呼叫使用其裝置驅動程式與裝置進行互動。 linux系統中有兩種常用的設備文件:字元特殊文件和區塊特殊文件,它們間的差異在於作業系統和硬體讀取和寫入的資料量。
本教學操作環境:linux5.9.8系統、Dell G3電腦。
裝置檔案概述
在類別Unix操作系統中,裝置檔案或特殊檔案是裝置驅動程式的介面,出現在檔案系統中就好像它是普通檔案一樣。在MS-DOS,OS / 2和Microsoft Windows中也有特殊檔案。 這些特殊檔案允許應用程式透過標準輸入/輸出系統呼叫使用其裝置驅動程式與裝置進行互動。 使用標準系統呼叫簡化了許多程式設計任務,無論裝置的特性和功能如何,都可以實現一致的使用者空間I / O機制。
裝置檔案通常提供與標準裝置(如印表機和序列埠)的簡單接口,但也可用於存取這些裝置(如磁碟分割區)上的特定獨特資源。此外,設備檔案對於存取與任何實際設備(如資料接收器和隨機數產生器)無關的系統資源非常有用。
圖1 應用程式、區塊檔案、驅動程式、硬體之間的關係
類別Unix作業系統中有兩種常用的設備文件,稱為字元特殊文件和區塊特殊文件。 它們之間的差異在於作業系統和硬體讀取和寫入的資料量。與命名管道不同,它們可以稱為設備專用文件,但命名管道並不連接到設備,但也不是普通文件。
在某些類別Unix系統中,大多數裝置檔案作為傳統上安裝在/ dev的虛擬檔案系統的一部分進行管理,可能與控制守護程式相關聯,該守護程式在執行時間監視硬體新增和刪除,對裝置檔案系統進行相應更改,如果對裝置檔案系統進行更改的操作不是核心自動完成的,則控制守護程式可能會呼叫系統或使用者空間中的腳本來處理特殊裝置需求。
FreeBSD和DragonFly BSD實作已經命名了虛擬裝置檔案系統devfs和關聯的守護程式devd。 Linux主要使用稱為udev的用戶空間實現,但有許多變體。 Darwin以及基於它的macOS等作業系統都有純粹的基於核心的裝置檔案系統。
在支援chroot進程隔離的Unix系統中,例如Solaris Containers,通常每個chroot環境都需要它自己的/ dev; 這些安裝點將在全域檔案系統樹中各個節點上的主機作業系統上可見。透過限制將裝置節點填入/ dev的chroot實例中,硬體隔離可以由chroot環境強制實施(程式不能插入硬件,它既不能看到也不能存取名稱- 這是比Unix檔案系統權限更強的存取控制形式)。
裝置節點對應於作業系統核心已經分配的資源。 Unix透過一個主號碼和一個次號碼來識別這些資源, 都作為節點結構的一部分儲存。這些編號的分配在不同的作業系統和不同的電腦平台上獨特地發生。通常,主機號碼標識設備驅動程序,次號碼標識驅動程式控制的特定設備(可能超出許多設備): 在這種情況下,系統可能會將次號碼傳遞給驅動程式。但是,在動態分配數字的情況下,情況可能並非如此(例如,在FreeBSD 5及更高版本上)。
與其他特殊檔案類型一樣,電腦系統使用標準系統呼叫存取設備節點,並將它們視為普通電腦檔案。存在兩種標準類型的設備文件; 不幸的是,由於歷史原因,他們的名字相當反直覺,因此解釋兩者之間的差異通常是不正確的。
區塊檔案分類
字元裝置(Character devices)
字元特殊檔案或字元裝置提供無緩衝,直接存取硬體裝置。它們不一定允許程式一次讀取或寫入單個字元; 這取決於所討論的設備。例如,硬碟的字元設備通常會要求所有讀寫操作都對齊到區塊邊界,並且絕對不允許讀取單一位元組。
字元設備有時被稱為原始設備,以避免圍繞一個基於區塊的硬體的字元設備通常需要程式讀取和寫入對齊的區塊的事實混淆。
區塊裝置(Block devices)
#區塊特殊檔案或區塊裝置提供對硬體裝置的緩衝訪問,並提供一些抽象的細節。與字元設備不同,區塊設備將始終允許程式設計師讀取或寫入任何大小的區塊(包括單個字元/位元組)和任何對齊。缺點是由於區塊裝置被緩衝,程式設計人員不知道在寫入資料從核心的緩衝區傳遞到實際裝置之前需要多長時間,或者實際上兩個單獨的寫入將以什麼順序到達實體裝置?此外,如果相同的硬體暴露字元和區塊設備,則由於客戶端使用字元設備不知道區塊設備的緩衝區中所做的變更而導致資料損壞的風險。
偽設備(Pseudo-devices)
#類別Unix系統上的裝置節點不一定要與實體設備相對應。缺乏這種對應關係的節點形成了一組偽裝置。它們提供作業系統處理的各種功能。一些最常用的(基於字元的)偽裝置包括:
/ dev / null - 接受并放弃所有输入; 不产生输出(总是在读取时返回文件结束指示) / dev / zero - 接受并放弃所有输入; 产生连续的NUL(零值)字节流 / dev / full - 读取时会产生连续的NUL(零值)字节流,并在写入时返回“磁盘已满”消息 / dev / random和/ dev / urandom - 它们产生一个可变长度的伪随机数字流。
節點建立
節點由mknod系統調用創建。用於建立節點的命令列程式也稱為mknod。通常的檔案系統呼叫(重新命名,取消連結)和命令(mv,rm)可以移動或刪除節點。當複製設備節點時傳遞選項-R或-a時,cp -l指令會建立一個與原始屬性相同的新設備節點。
某些Unix版本包含一個名為makedev或MAKEDEV的腳本,用於在目錄/ dev中建立所有必要的裝置。只有在其設備被靜態分配主要編號的系統上(例如,透過在其核心模組中對其進行硬編碼)才有意義。
區塊檔案命名規則
以下前綴用於/ dev層次結構中某些裝置的名稱,以識別裝置的類型:
lp:行式打印机(比较lp) pt:伪终端(虚拟终端) tty:终端 一些额外的前缀已经在一些操作系统中普遍使用: fb:帧缓冲区 fd :(平台)软盘,尽管这个缩写也常用来指文件描述符 高清:(“经典”)IDE驱动程序(以前用于ATA硬盘驱动器,ATAPI光盘驱动器等) hda:第一个ATA通道上的主设备(通常由主编号3和次编号0标识) hdb:第一个ATA通道上的从属设备 hdc:第二个ATA通道上的主设备 hdc1:此磁盘上的第一个主分区(示例) hdc5:扩展分区中的第一个逻辑驱动器(示例) hdd:第二个ATA通道上的从属设备 parport,pp:并行端口 SCSI驱动程序,也被libATA(现代PATA / SATA驱动程序),USB,IEEE 1394等使用。 sd:大容量存储驱动程序 sda:首次注册的设备 sda4:此磁盘上的最后一个分区(示例) sda6:扩展分区中的第二个逻辑驱动器(示例) sdb,sdc等:第二,第三等注册设备 ses:机箱驱动程序 sg:通用SCSI层 sr:“ROM”驱动程序(面向数据的光盘驱动器; scd只是一个辅助别名) st:磁带驱动器 tty:终端 ttyS :(平台)串口驱动程序 ttyUSB:USB串口转换器,调制解调器等
在Linux中使用的前綴規格清單可以在Linux裝置清單中找到,Linux裝置清單是Linux作業系統的分配設備編號和/ dev目錄節點的正式註冊表。
對於大多數裝置而言,此前綴後面跟著唯一標識特定裝置的編號。對於硬碟驅動器,使用字母來標識設備,然後使用數字來識別分區。因此,檔案系統可以透過/dev/sda3找到磁碟上的區域;把/dev/pts/14與聯網的終端會話連結起來。
操作設備檔案的相關指令
#mknod
大家如果對嵌入式有興趣,大家可以自行查看該指令的使用方法。
相關推薦:《Linux影片教學》
以上是什麼是linux設備文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!