目錄概述
檔案的描述
vfs系統的資料型別
各個資料結構之間的關係
vfs初始化
linux世界中一切都是檔案,linux檔案子系統vfs(virtual filesystem)為使用者提供了檔案和檔案系統的相關介面,系統中所有檔案系統依賴vfs來協同工作。linux的 檔案包含兩部分目錄和檔案,一般採用樹狀的結構進行組織,如:
│ ├── desktop
│ │ └── jprofiler.desktop
│ ├── develop
│ │ ├── busybox
│ │ │ │ ├── built-in.o
路徑字串:
/home/dw/readme.txt
表示乙個名稱為readme.txt 的檔案,它在目錄/home/dw中。在這裡目錄和檔案看起來屬於不同的例項,但首先明確一下,在linux中目錄也屬於檔案,它可以列出其中所包含的所有檔案,它也可以執行檔案操作。
檔案的組成:
1. 檔案
1. 檔案的相關資訊(建立時間,擁有者等也稱為元資料inode)
2. 檔案本身
2. 檔案系統的控制資訊
vfs為了描述為了描述檔案,在vfs系統中使用了對應的四種物件:
• 超級塊物件
• 索引節點物件
• 目錄物件
• 檔案物件
其中在大多linux系統中超級塊物件會儲存在磁碟的特定扇區否則會在使用現場建立
資料型別
描述struct file_system_type
描述檔案系統型別,如ext4
struct super_block
每種檔案系統都必須實現超級塊物件,用於儲存特性檔案系統資訊,對應存放與磁碟特定扇區
struct inode
包含核心操作的全部資訊,對於linux可以從磁碟索引節點直接讀入,否則要檔案系統提取這些資訊,在記憶體中建立,便於檔案系統使用。
struct dentry
檔案包括路徑中的每個部分都是目錄項,沒有對應的磁碟資料結構。有三種狀態:1)被使用2)未被使用3)無效目錄項
struct mount
安裝檔案系統的例項,代表乙個安裝點,包含乙個 struct vfsmount成員
struct file
使用程序的觀點看檔案,表示程序已經開啟的檔案。包含訪問模式,當前偏移等。
struct fs_struct
程序描述符中使用,檔案系統和程序相關資訊,如當前工作目錄和根目錄
struct files_struct
程序描述符中使用,程序的相關資訊,如開啟的檔案以及描述符
struct nsproxy
程序描述符中使用,程序的命名空間層次結構。預設情況下,所有的程序共享相同的命名空間,可以通過clone_newns配置。
int copy_namespaces(unsigned long flags, struct task_struct *tsk)
……………….. }
各個資料結構之間的引用關係:
在start_kernel中通過下面兩個函式初始化:
asmlinkage __visible void __init start_kernel(void)
其中:
void __init vfs_caches_init_early(void)
void __init vfs_caches_init(unsigned long mempages)
在dcache_init,inode_init同dcache_init_early, inode_init_early函式中分別建立dentry和inode的slab cache和hash table,在slab cache中儲存資料,使用hash table為其建立索引表,典型的以空間換時間方式。這裡使用有early字尾和沒有early字尾的函式是根據hash是否分布在numa上來選擇hash table的建立時機是否推遲到vmalloc空間可以使用。
void __init inode_init(void)
在呼叫sysfs_init函式之前為dentry, inode,file,mount,kernfs_node建立了slab cache,為了方便索引、提高效率還建立了部分hash表。
void __init mnt_init(void)
在上面函式中註冊了3個檔案系統型別(file_system_type),分別是:
sysfs : sysfs_fs_type
rootfs: rootfs_fs_type
ramfs : ramfs_fs_type
下面通過init_mount_tree 函式安裝根檔案系統 :其中,檔案系統的安裝和初始化需要分配super_block和inode,他們的分配初始化通過下面的呼叫完成。
init_mount_tree-->vfs_kern_mount-->
mount_fs-->rootfs_mount-->mount_nodev-->ramfs_fill_super。
error = fill_super(s, data, flags & ms_silent ? 1 : 0);
static void __init init_mount_tree(void)
隨後vfs_caches_init呼叫bdev_cache_init、chrdev_init。
void __init vfs_caches_init(unsigned long mempages)
初始字元裝置,塊裝置,完成vfs初始化。 Linux支援檔案系統與VFS
雖然linux的標準檔案系統是ext2,且還增加了日誌功能的ext3,事實上,linux還支援很多檔案系統格式的,尤其是最近幾年退出的好幾種速度很快的日誌式檔案系統,包括sgi的xfs檔案系統,可以使用更小型檔案的reiserfs檔案系統,以及windows的fat檔案系統等等,都能夠被linux所...
linux虛擬檔案系統vfs
linux可以掛載不同的檔案系統 ext2,fat,ntfs 用同一的樣式呈現給使用者,讀寫操作用起來都一樣,這是怎樣做到的呢?linux核心在各種不同的檔案系統格式上做了乙個抽象層,使得檔案 目錄 讀寫訪問等概念成為抽象層的概念,因此各種檔案系統看起來用起來都一樣,這個抽象層稱為虛擬檔案系統 vf...
linux檔案系統(一) VFS的概念
宣告 本 linux檔案系統 部落格,共分四節,linux 之所以能支援除了 ext2 檔案系統之外的各種檔案系統,是因為 linux 提供了一種統一的框架 就是所謂的虛擬檔案系統轉換 virtual filesystemswitch 簡稱虛擬檔案系統 vfs 這樣,使用者程式可以通過同乙個檔案系統...