歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux虛擬文件系統VFS

Linux虛擬文件系統VFS

日期:2017/2/28 13:53:19   编辑:Linux教程

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的核心概念。

Copyright © Linux教程網 All Rights Reserved