Linux檔案子系統( VFS)的初始化

2021-09-07 14:24:45 字數 3024 閱讀 2529

目錄概述

檔案的描述

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 這樣,使用者程式可以通過同乙個檔案系統...