文件系統VFS內核4.0.4版本基本概念源碼

題外話:Linux內核從2.x和3.x到如今最新的4.x變化很是大,最直觀的表現就是不少書上的內核代碼已經沒法直接繼續使用,因此看看新的源碼是很是有意義的!node

 

(下文中的內核源碼都來自於 kernel 4.0.4 版本,本人都驗證過正確,正文假設讀者對 linux系統下mount命令有操做經驗。另外,linux內核源碼中關於文件操做的代碼量比內存管理或者設備管理多了不止一個數量級,因此想要把每一 個地方徹底說清楚是遠在我能力以外的..這篇文章的意義就是幫助創建起來一個超級塊,索引和目錄的有層次的模型。如下的代碼中我儘可能保留了源碼中的英文注 釋,而後對於比較重要的部分都進行了翻譯註解)linux

 

一. VFS(Virtual File System)處理文件系統掛載最基本的數據結構---vfsmount編程

 

vfsmount 這個結構體的功能不深刻討論,可是必須清楚的一點是每一個文件系統都有一個這樣的結構。首先必需要知道這個結構體是作什麼用的,當文件系統要進行掛載工做的 時候,是與之對應的vfsmount結構體被添加到內核之中的一個全局鏈表---mount_hashtable數組鏈表之中。 mount_hashtable是個數組,每個成員都是一個hash鏈表,例如在進行文件搜索的時候,遍歷到一個「特殊的目錄「(好比U盤掛載的目錄) 時,就會進行從mount_table找到對應的鏈表頭部,再遍歷整個hash鏈表直到找到與之對應的vfsmount結構,而後將該特殊目錄的目錄結構 體dentry(下文詳述)進行替換,使之成爲新文件系統的根目錄。以下是vfsmount結構體:數組

(一些較早的vfsmount結構體成員定義有十幾個可是這裏就只剩下了3個成員)緩存

 

View Code

 


 

二. 文件系統「三大元老」數據結構

 

(1)super_block超級塊架構

 

   超級塊表明了整個文件系統的自己,通常來說,超級塊與vfsmount雖然同樣是和整個文件系統一一對應的關係,可是super_block負責的是控 制的部分,而vfsmount單純是掛載方面。這些在以後的文件操做之中詳細再說,超級塊和下面要說的索引結點和目錄結點都是運用了C語言來實現面向對象編程, 用一個結構體來做爲C++中的虛表或者JAVA中的接口。超級塊結構體保存的是文件系統設定的文件塊的大小,超級塊的操做函數,和整個文件系統中的全部索 引結點。不一樣文件系統的控制會包含不一樣的控制信息,而super_block結構體保存了這些咱們須要的結構體信息。super_block結構體的每一個 成員都是推薦理解而不是強記,一是容易忘記,二是版本迭代太快,固然除非工做須要~函數

 

View Code

 

附:file_system_type結構體,能夠跳過spa

View Code

 

 

(2)目錄結點 dentry翻譯

 

  文 件系統通常是以樹狀結構進行管理的,目錄是最直觀的表現,全部的目錄一層一層組織,最終匯聚於根目錄。對於這個樹狀結構是用dentry結構體進行組織 的。正如在linux中目錄自己也是一個特殊的文件。每個文件都一個dentry,這個dentry都被遞歸地連接到上層,直到根目錄。爲了加快進行查 找的速度,內核一樣使用了hash表來緩存dentry,被稱做dentry cache,這個數據結構使用的很是的頻繁,由於每每要反覆對同一個文件繼續操做,若是每次操做都須要在文件系統中進行一次搜索的話時間代價是很是高的, 因此大部分的遍歷查找dentry以前都要先對dentry cache內進行查找。

 

View Code

 

 

(3)索引結點對象 inode

 

  索引結點對象和目錄結點對象的最大不一樣在於:目錄結點對象指的是邏輯意義上的文件,而索引結點對象指的是物理意義上 的文件,目錄項在磁盤上並無與之對應的映像,而每一個索引節點在磁盤上都個與之對應的映像。inode就表明了一個文件,inode保存了文件的大小,創 建時間,文件的塊的大小等參數,由於指向文件的路徑能夠有多個(好比ln命令產生的文件),而inode只有一個!inode結構和文件系統是無關 的,inode在文件的整個生命週期都存在,並且包含了磁盤上的維護的數據。

View Code

 

 

三. 內核中的文件對象 file

 

這個結構體其實是和vfs架構沒有聯繫的,只是在linux內核之中的文件對象,每當打開一個文件,內核之中就會建立一個對之相關聯的file結構,而且傳遞給文件上進行操做的任何函數。在文件的全部實例都被釋放了以後,內核中的file結構也就會被釋放。

View Code

 

 

總結概括:

(1)vfsmount,super_block,dentry,inode 結構在內核之中都有一個全局的hash表緩存用來加快訪問的速度,每一個hash數組存着hash鏈表將相同種類的結點種類放在同一個鏈表中,並專門設置一 個成員變量用來訪問在hash鏈表中與之相鄰的結點。

(2)file和dentry更可能是邏輯意義上的,super_block和inode更可能是物理意義上的。

(3)最後獻上一張圖,我的認爲是總結linux文件系統結構最全面的一張圖

相關文章
相關標籤/搜索