linux支援多種檔案系統型別的方式和其他類unix系統類似,通過虛擬檔案系統來實現。
對每個讀,寫或其他操作檔案系統的呼叫函式,核心都用實際支援各種檔案系統的函式來代替。
12.1 虛擬檔案系統(vfs)的角色
vfs是乙個核心軟體層,用來處理與標準unix檔案系統相關的全部系統呼叫。它主要作用是為多種檔案系統提供通用介面。
vfs是乙個在應用程式和(實際的)檔案系統實現之間的抽象層。
vfs支援的檔案系統可以分成三類:
a.基於磁碟的檔案系統disk-based filesystems
管理在本地磁碟或其他模擬磁碟的裝置上的可用記憶體空間。
b.網路檔案系統network filesystems
c.特殊檔案系統special filesystems
該檔案系統不管理本地或者遠端的磁碟空間。/proc檔案系統就是乙個典型的特殊檔案系統。
12.1.1 通用檔案模型
vfs背後的關鍵思想在於提出了能夠代表全部所支援檔案系統的通用檔案模型(common file model)。
然而,每個特定的檔案系統實現必須把它的物理組織轉變成vfs的通用檔案模型。
例如,在通用檔案模型中,每個目錄被當成是乙個檔案,包含了一列檔案和其他目錄。
檔案在核心記憶體中由file資料結構表徵,該資料結構包含乙個叫做f_op的成員,包含有指向特定檔案系統函式實現的指標。
通用檔案模型包含以下幾個物件型別:
a.超級塊superblock
儲存乙個已掛載檔案系統的資訊。對於基於磁碟的檔案系統來說,該物件通常對應儲存在磁碟上的檔案系統控制塊。
b.索引節點inode
儲存乙個指定檔案的一般資訊。對基於磁碟的檔案系統,該物件通常對應儲存在磁碟上的檔案控制塊。
c.檔案file
儲存程序和開啟檔案之間互動的資訊。該資訊只有程序開啟檔案期間存在於核心記憶體中。
d.目錄項dentry
儲存對應檔案的目錄入口的連線資訊。
圖12-2闡述了乙個簡單例子關於程序如何跟檔案互動。三個不同的程序開啟了同乙個檔案,其中兩個使用同乙個硬鏈結。在次情況下,每個程序使用各自的file物件,同時為每個硬鏈結對應乙個dentry物件。但是兩個dentry物件都指的是同乙個inode物件,inode物件標識了superblock物件和該通用磁碟檔案。
除了為所有的檔案系統實現提供通用的介面,vfs在系統效能上也扮演了重要的角色。最近使用的dentry物件包含在稱作dentry cache的磁碟快取中,加快了從檔案路徑到檔案索引節點的轉換。
通俗地講,磁碟快取是一種軟體機制使得核心可以把通常儲存在磁碟中的資訊儲存在ram中,那麼對該資料進一步地訪問可以被迅速地滿足而不用訪問緩慢的磁碟。
應當注意磁碟快取如果區別於硬體快取或者記憶體快取,它們當中沒有乙個跟磁碟或者其它裝置有關。硬體快取是乙個快速靜態ram,加速了向慢速動態ram發出的請求。記憶體快取是乙個軟體機制,用來繞過核心記憶體分配器(kernel memory alloctor)。
12.1.2 由vfs處理的系統呼叫
我們在前面說過vfs是應用程式和特定檔案系統之間的一層。然而在某些情況下,乙個檔案操作可以直接由vfs完成,而不需要呼叫到底層的**。比如,當乙個程序關閉了乙個開啟的檔案,並不需要操作在磁碟上的該檔案,因此vfs僅僅是釋放對應的file物件。類似的,當lseek()系統呼叫修改了檔案指標,作為乙個開啟檔案和程序之間的互動屬性,vfs也只需修改對應的file物件而不用訪問磁碟上的檔案,因此它不需要呼叫特定的底層**。
12.2 vfs資料結構
所有的超級塊物件都鏈在乙個環形雙向鍊錶中,該鍊錶的第乙個元素是super_blocks變數。
一般而言,由s_fs_info成員指向的資料是磁碟的資訊,出於效率的考慮存放在記憶體中。每個基於磁碟的檔案系統為了分配或者釋放磁碟塊需要訪問並更新它的分配位圖。vfs允許檔案系統在不訪問磁碟的情況下直接操作s_fs_info成員。
這種方式會導致乙個問題,vfs的超級塊可能跟磁碟上對應的超級塊沒有同步。因此有必要引出s_dirt標誌,表明該超級塊是否是dirty,也就是磁碟上的資料是否需要更新。
12.2.2 inode物件
檔案系統操作乙個檔案所需要的全部資訊都包含在inode資料結構中。檔案名字只是可以改變的乙個標號,但是inode對檔案來說是唯一的,只要檔案存在,它就存在。
當i_state成員的值等於i_dirty_sync,i_dirty_datasync,或i_dirty_pages時,inode是dirty,也就意味著對應的磁碟inode必須更新。i_dirty巨集可以用來檢查這三個標誌的值。i_state成員其它的值有i_lock(inode物件正被捲入i/o傳輸中),i_freeing(inode物件已被釋放),i_clear(inode物件的內容已無意義),和i_new(inode物件已被分配但是還沒有從磁碟inode讀取內容填充它)。
每個inode物件包含在超級塊中以s_inodes成員為頭結點的鍊錶中;inode物件的i_sb_list成員儲存了指向臨近成員的指標。
12.2.3 file物件
儲存在file物件中的最主要的資訊是檔案偏移指標,表明了下一次程序操作的位置。因為多個程序可能同時訪問同乙個檔案,檔案偏移指標必須儲存在file物件中而不是inode物件中。
虛擬檔案系統
虛擬檔案系統 virtual file system,簡稱 vfs 是 linux 核心中的乙個軟體層,用於給使用者空間的程式提供檔案系統介面 同時,它也提供了核心中的乙個 抽象功能,允許不同的檔案系統共存。系統中所有的檔案系統不但依賴 vfs 共存,而且也依靠 vfs 協同工作。為了能夠支援各種實...
Linux核心 虛擬檔案系統
1.虛擬檔案系統是核心子系統,為使用者空間的程式提供了檔案和檔案系統的介面 2.vfs使得使用者可以直接使用系統呼叫而無需考慮具體檔案系統和實際物理介質 3.vfs定義了所有檔案系統都支援的介面和資料結構,同時檔案系統也將自身的一些概念在形式上和vfs保持一致 4.其實在核心中,除了檔案系統本身,其...
檔案系統 虛擬檔案系統(二)
二 虛擬檔案系統 6 與程序相關的檔案結構 檔案最終要被程序訪問,乙個程序可以開啟多個檔案,而乙個檔案可以被多個程序同時訪問。這裡程序是通過檔案描述符來抽象所開啟的檔案的,用使用者開啟檔案表來描述和記錄程序開啟檔案描述符的使用情況。1 檔案物件 每個開啟的檔案都用乙個32位的數字來表示下乙個讀寫的位...