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

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

題外話:Linux內核從2.x和3.x到現在最新的4.x變化非常大,最直觀的表現就是很多書上的內核代碼已經無法直接繼續使用,所以看看新的源碼是非常有意義的!

 

(下文中的內核源碼都來自於 kernel 4.0.4 版本,本人都驗證過正確,正文假設讀者對 linux系統下mount命令有操作經驗。另外,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結構體,可以跳過

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文件系統結構最全面的一張圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章