Linux核心學習:虛擬檔案系統
Linux的成功因素之一是它具有與其它作業系統和諧共存的能力,其中代表作之一就是虛擬檔案系統(VFS)。
VFS的思想是把不同型別檔案的共同資訊放入核心,具體思路是通過Linux在使用者程序(或C庫)和檔案系統之間引入了一個抽象層,該抽象層稱之為虛擬檔案系統(VFS)。
VFS的任務主要是提供一種操作檔案、目錄以及其他物件的統一方法還有它必須能夠與各種方法給出的具體檔案系統實現達成妥協。
虛擬檔案系統的型別
VFS的型別主要分三種:
-
基於磁碟的檔案系統:是在非易失介質上儲存檔案的經典方法,用以在多次會話之間保持檔案的內容。
-
特殊檔案系統:在核心中生成,是一種使用使用者應用程式與使用者通訊的方法。它位於核心軟體層,用來處理與Unix標準檔案系統相關的所有系統呼叫(Linux的 proc檔案系統就是這一類的最佳示例)
-
網路檔案系統:是基於磁碟檔案系統和虛擬檔案系統之間的折中,這些檔案系統允許輕易訪問屬於其它網路計算機的檔案系統所包含的檔案(常見的網路檔案系統有:NFS、Coda、AFS、CIFS、NCP等)
通用檔案模型
通用檔案模型嚴格反映傳統Unix檔案系統的檔案模型,從本質上,Liunx不能對一個特點的函式進行硬編碼來執行諸如read() 和 ioctl() 這類的操作,而是對每個操作都必須使用一個指標,指向要訪問的具體檔案系統的適當函式。通過通用檔案模型,VFS使得使用者可以直接使用open()、read()、write() 這樣的呼叫而無須考慮具體這樣的檔案系統。
VFS採用了面向物件的設計思路,使用了一組資料結構來表示通用檔案物件,這些物件組成了Linux的通用檔案模型。
1)超級快物件(superblock object):存放已安裝檔案系統有關的資訊
superblock的資料結構
2)索引節點物件(inode object):存放具體檔案的一般資訊(核心在操作檔案或目錄時需要的全部資訊)。一個索引節點代表檔案系統中的一個檔案,但是索引節點僅當檔案被訪問時,才在記憶體中建立。
inode的資料結構
3)檔案物件(file object):它代表由程序開啟的檔案。這類資訊僅當程序訪問期間存在於核心記憶體中。檔案物件(不是物理檔案)由相應的open()系統呼叫建立,由close()系統呼叫撤銷。
file的資料結構
4)目錄項物件(dentry object):不是指目錄,VFS把目錄作為一個檔案看待,這裡的目錄項物件指的是路徑的一個組成部分,與對應檔案進行連結的有關資訊。
dentry的資料結構
VFS物件之間的關係如下:
程序與VFS物件之間的互動如下:
目錄專案快取記憶體(dcache)
為了最大限度地提高處理目錄項物件的效率,Linux使用目錄項快取記憶體,它由2種類型的資料結構組成:
-
一個處於
正在使用
、未使用
、負狀態
的目錄物件的集合:正在使用和未使用的目錄項物件對應一個有效的索引節點,負狀態的目錄項物件沒有對應的有效索引節點 -
一個散列表,從中能夠快速獲取與給定的檔名和目錄名對應的目錄項物件。
小結
VFS是一個膠水層,位於核心的底層和使用者層之間。它提供了各種抽象資料結構來表示檔案和inode。而真實檔案系統必須填充這些結構,使得應用程式無需考慮底層檔案系統,總是可以使用同樣的介面訪問和操作檔案。