2021-05-12 14:32:11
Linux虛擬檔案系統VFS
Linux在不同的檔案系統之上做了一個抽象層,使得檔案、目錄、讀寫存取等概念都成為抽象層概念,這個抽象層被稱為虛擬檔案系統(VFS)。
Linux核心的VFS子系統如下:
每個進程在PCB(Process Control Block)中都儲存著一份檔案描述符表,檔案描述符就是這個表的索引,每個表項都有一個指向已開啟檔案的指標,一開啟的檔案在核心中用file結構體表示,檔案描述符表中的指標指向file結構體。
在file結構體中維護File Status Flag(file結構體的成員f_flags)和當前讀寫位置(file結構體的成員f_pos)。在上圖中,進程1和進程2都開啟同一檔案,但是對應不同的file結構體,因此可以有不同的File Status Flag和讀寫位置。file結構體還有一個成員f_count,表示參照計數(Reference Count),如果有兩個檔案描述符指向同一個file結構體,那它的參照計數就是2,當close()一個檔案描述符時並不會釋放file結構體而是將參照計數減到1,再close一個檔案描述符參照計數就會變成0同時再釋放file結構體。真正的關閉檔案。
每個file結構體都指向了一個file_operations結構體,這個結構體的成員都是函數指標,指向實現各種檔案操作的核心函數。例在使用者程式中read一個檔案描述符,read通過系統呼叫進入核心,然後找到這個檔案描述符指向的file結構體,找到file結構體所指向的file_operations結構體,呼叫它的read成員所指向的核心函數以完成使用者請求。對於同一檔案系統上開啟的常規檔案來說,read、weite等檔案操作的步驟和方法應該是一樣的,呼叫的函數應該是相同的,所以圖中三個開啟檔案的file結構體指向同一個file_operation結構體,如果開啟的是非常規檔案那就不一樣了。每個file結構體都有一個指向dentry結構體的指標,“dentry”是directory entry(目錄項)的縮寫。我們傳給open、stat等函數的引數是一個路徑,例如/home/orlion/a,需要根據路徑找到檔案的inode。為了減少讀盤次數,核心快取了目錄的樹狀結構,稱為dentry cache,其中每個節點是一個dentry結構體,只要沿著路徑各部分的dentry搜尋即可,從根目錄/找到home目錄,然後找到orlion目錄,然後找到檔案a。dentry cache只儲存最近存取過的目錄項,如果要找的目錄項在cache中沒有,就要從磁碟中讀到記憶體中。
每個dentry結構體都有一個指標指向inode結構體。inode結構體儲存著從磁碟inode讀上來的資訊。上圖中有兩個dentry,分別表示/home/akaedu/a和/home/akaedu/b,它們都指向同一個inode,說明這兩個檔案互為硬連結。inode結構體中儲存著從磁碟分割區的inode讀上來資訊,例如所有者、檔案大小、檔案型別和許可權位等。每個inode結構體都有一個指向inode_operations結構體的指標,後者也是一組函數指標指向一些完成檔案目錄操作的核心函數。和file_operations不同,inode_operations所指向的不是針對某一個檔案進行操作的函數,而是影響檔案和目錄布局的函數,例如新增刪除檔案和目錄、跟蹤符號連結等,屬於同一檔案系統的個inode結構體可以指向同一個inode_operation結構體。
inode結構體有一個指向super_block結構體的指標。super_block結構體儲存著從磁碟分割區的超級快上讀來的資訊,例如檔案系統型別,塊大小等。super_block結構體的s_root成員是一個指向dentry的指標,表示這個檔案系統的根目錄被mount到哪裡。
file、dentry、inode、super_block這幾個結構體組成了VFS的核心概念。
本文永久更新連結地址:http://www.linuxidc.com/Linux/2016-04/129822.htm
相關文章