本文闡述 Linux 中的文件系統部分,源代碼來自基于 IA32 的 2.4.20 內核。總體上說Linux下的文件系統主要可分為三大塊:一是上層的文件系統的系統調用,二是虛擬文件系統 VFS(Virtual Filesystem Switch),三是掛載到 VFS 中的各實際文件系統,例如 ext2,jffs 等。本文側重于通過具體的代碼分析來解釋 Linux 內核中 VFS 的內在機制,在這過程中會涉及到上層文件系統調用和下層實際文件系統的如何掛載。文章試圖從一個比較高的角度來解釋 Linux 下的 VFS 文件系統機制。
1. 摘要
本文闡述 Linux 中的文件系統部分,源代碼來自基于 IA32 的 2.4.20 內核。總體上說 Linux 下的文件系統主要可分為三大塊:一是上層的文件系統的系統調用,二是虛擬文件系統 VFS(Virtual Filesystem Switch),三是掛載到 VFS 中的各實際文件系統,例如 ext2,jffs 等。本文側重于通過具體的代碼分析來解釋 Linux 內核中 VFS 的內在機制,在這過程中會涉及到上層文件系統調用和下層實際文件系統的如何掛載。文章試圖從一個比較高的角度來解釋 Linux 下的 VFS 文件系統機制,所以在敘述中更側重于整個模塊的主脈絡,而不拘泥于細節,同時配有若干張插圖,以幫助讀者理解。
相對來說,VFS 部分的代碼比較繁瑣復雜,希望讀者在閱讀完本文之后,能對 Linux 下的 VFS 整體運作機制有個清楚的理解。建議讀者在閱讀本文前,先嘗試著自己閱讀一下文件系統的源代碼,以便建立起 Linux 下文件系統最基本的概念,比如至少應熟悉 super block, dentry, inode,vfsmount 等數據結構所表示的意義,這樣再來閱讀本文以便加深理解。
2. VFS 概述
VFS 是一種軟件機制,也許稱它為 Linux 的文件系統管理者更確切點,與它相關的數據結構只存在于物理內存當中。所以在每次系統初始化期間,Linux 都首先要在內存當中構造一棵 VFS 的目錄樹(在 Linux 的源代碼里稱之為 namespace),實際上便是在內存中建立相應的數據結構。VFS 目錄樹在 Linux 的文件系統模塊中是個很重要的概念,希望讀者不要將其與實際文件系統目錄樹混淆,在筆者看來,VFS 中的各目錄其主要用途是用來提供實際文件系統的掛載點,當然在 VFS 中也會涉及到文件級的操作,本文不闡述這種情況。下文提到目錄樹或目錄,如果不特別說明,均指 VFS 的目錄樹或目錄。圖 1 是一種可能的目錄樹在內存中的影像:
圖 1:VFS 目錄樹結構
3. 文件系統的注冊
這里的文件系統是指可能會被掛載到目錄樹中的各個實際文件系統,所謂實際文件系統,即是指VFS 中的實際操作最終要通過它們來完成而已,并不意味著它們一定要存在于某種特定的存儲設備上。比如在筆者的 Linux 機器下就注冊有 "rootfs"、"proc"、"ext2"、"sockfs" 等十幾種文件系統。
3.1 數據結構
在 Linux 源代碼中,每種實際的文件系統用以下的數據結構表示: struct file_system_type { const char *name; int fs_flags; struct super_block *(*read_super) (struct super_block *, void *, int); struct module *owner; struct file_system_type * next; struct list_head fs_supers; }; |
3.2 注冊 rootfs 文件系統
在眾多的實際文件系統中,之所以單獨介紹 rootfs 文件系統的注冊過程,實在是因為該文件系統 VFS 的關系太過密切,如果說 ext2/ext3 是 Linux 的本土文件系統,那么 rootfs 文件系統則是 VFS 存在的基礎。一般文件系統的注冊都是通過 module_init 宏以及 do_initcalls() 函數來完成(讀者可通過閱讀module_init 宏的聲明及 arch\i386\vmlinux.lds 文件來理解這一過程),但是 rootfs 的注冊卻是通過 init_rootfs() 這一初始化函數來完成,這意味著 rootfs 的注冊過程是 Linux 內核初始化階段不可分割的一部分。
init_rootfs() 通過調用 register_filesystem(&rootfs_fs_type) 函數來完成 rootfs 文件系統注冊的,其中rootfs_fs_type 定義如下:
struct file_system_type rootfs_fs_type = { name: "rootfs", read_super: ramfs_read_super, fs_flags: FS_NOMOUNT|FS_LITTER, owner: THIS_MODULE, } |
圖 2: file_systems 鏈表結構
共2頁: 1 [2] 下一頁 | ||
|