侯旗,陳慈發,艾偉
(三峽大學,宜昌443002)
隨著嵌入式技術的發展,越來越多的嵌入式設備采用Linux作為其操作系統。Linux支持各種物理文件系統,而不同物理文件系統具有不同的組織結構和不同的處理方式。為了兼容支持不同的文件系統,Linux設計了在系統啟動時由系統在內存創建的文件系統,即虛擬文件系統(Virtual File System,VFS)。該文件系統對不同的物理文件系統的所有特性進行抽象,屏蔽各種文件系統的差別,向Linux內核和進程提供了一個處理各種物理文件系統的公共接口,從而實現了對不同文件系統的支持。而且,Linux系統把一切的設備也當作文件來處理。理解Linux虛擬文件系統機制對于學習Linux運行原理起著重要的作用。本文對Linux虛擬文件系統原理進行了較為詳盡的分析。
Linux以EXT2作為基本的文件系統,組成虛擬文件系統的超級塊、索引節點、目錄項等數據結構,兼容于各種文件系統的相應數據結構,從而實現了對多種文件系統的透明調用。
Linux繼承了Uinx,把文件名和文件控制信息分開管理。一個Linux所支持的物理文件系統使用的塊設備上的一個獨立邏輯分區可大致分為:引導塊、超級塊、inode塊、data塊4部分[1]。超級塊是描述文件系統整體信息的數據結構,在系統運行期間被讀入內存,在內存中建立一個超級塊的映像。Linux所支持的文件系統的一般結構如圖1所示。
圖1 Linux所支持的文件系統的一般結構
Linux VFS采用超級塊(super_block)和索引節點(inode)來描述文件系統。這里的super_block和inode不同于物理文件系統中的super_block和inode數據結構,VFS super_block是VFS把不同文件系統中的整體組織和結構信息進行抽象后形成的,兼顧不同文件系統的統一的超級塊結構。在安裝文件系統時,由系統在內存中建立,其內容主要由文件系統的超級塊數據來填充。inode則是在系統打開文件時,由系統在內存動態建立,其內容主要由文件系統的inode節點的數據來填充。
Linux VFS除了沒有存儲文件內容的data塊外,文件系統的結構與物理文件系統基本相似,如圖2所示。
圖2 Linux VFS文件系統結構
Linux進程通過VFS中相應的超級塊和索引節點中的信息,準確地訪問操作目的磁盤文件系統中的相應文件。
為了區分文件系統中的inode,這里把VFS中的inode稱為vnode。
Linux系統支持文件系統目錄樹機制,根據路徑名,如/home/xyz/work/test.c,就 可 以 在 磁 盤 上 找 到 文 件test.c的目錄項和索引節點。在路徑/home/xyz/work/test.c中,目錄/、home、xyz、work以及普通文件test.c都對應一個目錄項對象。目錄項在磁盤文件系統中的數據結構是dir_entry,VFS在遍歷路徑名的過程中將其解析成內存目錄項對象(dentry對象)和vnode對象。
vnode與某個文件的對應關系是通過設備號i_dev與inode號i_ino建立的,它們唯一地指定了某個設備上的一個文件或目錄。vnode是設備上的文件或目錄的inode在內存中的統一對應結構,并且給出了不同文件系統特有的信息,即各種文件系統的inode在內存中的映像。
如前所述,Linux繼承了Uinx,把文件名和文件控制信息分開管理,由目錄項(dir_entry)管理文件名,索引節點(inode)管理文件控制信息,并且通過dir_entry結構中的d_inode域指向文件的inode節點,建立與文件索引節點的聯系。文件的索引節點(inode)結構體包含了關于文件的組織信息和管理信息,根據其中的i_info查找存儲文件內容的數據塊,根據i_op指向的inode_operations結構,通過其中的指針函數調用各自的inode操作函數。
系統進程使用文件由表示進程當前打開的所有文件的數據結構files_struct建立進程與文件系統的關系。指針fd和fd_array都指向代表打開文件對象數組。進程調用文件操作函數,依據文件路徑打開文件,文件操作函數返回一整數,即文件描述符,例如int open(const char*pathname,int flages)[2]。之后,進程便用文件描述符來表示一個打開的文件,該整數文件描述符就是files_struct中file數組fd的下標。
圖3描述了進程使用文件時用到的VFS中主要數據結構的關系。
圖3 VFS中主要數據結構關系圖
dentry結構描述的是邏輯意義上的文件,記錄的是其邏輯上的屬性。只要是有效的dentry結構,則其指針d_inode必定指向一個inode結構。而inode結構所代表的是物理意義上的文件,記錄的是其物理上的屬性。一個inode結構可能對應著不只一個dentry結構,因為一個物理意義上的文件可以被鏈接(link)其他路徑名。
所以,在inode結構中有個隊列i_dentry,凡是代表著這個文件的所有目錄項(普通文件也是目錄文件的一種)都是通過dentry結構中的d_alias掛入相應的inode結構中的i_dentry隊列。
本文主要從數據結構的角度出發,對Linux虛擬文件系統的實現技術作了簡要的分析。Linux系統把一切設備都作為文件看待,深入探究Linux虛擬文件系統的文件組織方式,可以為系統軟件設計和嵌入式Linux驅動開發提供一定參考價值。
[1]毛德操.Linux內核源代碼情景分析(上)[M].杭州:浙江大學出版社,2009:428-430.
[2]韓超,魏治宇,寥文江.嵌入式linux上的C語言編程實踐[M].北京:電子工業出版社,2009:163-164.