歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> 《Linux內核設計與實現》筆記——VFS

《Linux內核設計與實現》筆記——VFS

日期:2017/3/1 11:44:47   编辑:Linux內核

VFS,虛擬文件系統,為用戶提供了文件和文件系統相關的接口。
這些接口可以跨越各種文件系統和不同介質執行。
VFS提供了一個通用文件系統模型,該模型囊括了任何文件系統的常用功能集和行為。
這裡寫圖片描述
該模型偏重於Unix風格的文件系統。

數據結構關系

如下圖,下圖描述了VFS相關數據結構的關系
這裡寫圖片描述

Unix文件系統

Unix使用了4個和文件系統相關的傳統概念:文件目錄項索引節點安裝點(mount point)

文件

簡單的面向字節流的抽象

目錄項

文件通過目錄組織起來,目錄中的每一個部分都是一個目錄條目, /home/wolfman/butter , / , home, wolfman , butter 都是目錄條目,統稱為目錄項

索引節點

Unix文件系統,將文件的相關信息和文件本身區分開來。文件控制信息,如權限,擁有者,大小,創建時間等”元數據”,被存儲在一個單獨的數據結構中,該結構被稱為索引節點inode

安裝點/掛載點

linux中的磁盤文件系統的入口目錄,類似於windows中的用來訪問不同分區的C:、D:、E:等盤符。[百度百科詞條]

文件系統的信息存儲在超級塊中,集單獨文件信息和文件系統信息於一身。
對於FAT,NTFS這種,雖然也可以在Linux上工作,但必須進行封裝。比如:一個文件系統不支持索引節點,也必須在內存中裝配索引節點結構體,就像它本身包含一樣。

VFS對象及數據結構

超級塊對象

代表一個具體的已安裝文件系統,由super_block結構體表示,定義於 包含操作對象super_operations對象,包括內核針對特定文件系統所能調用的方法,定義於
超級塊對象通過alloc_super()函數創建並初始化。在文件系統安裝時,文件系統會調用該函數以便從磁盤讀取文件系統超級塊,並將其信息填充到內存中的超級塊對象中各種文件系統都必須實現超級塊對象,該對象用於存儲特定文件系統信息,通常對應於存放在磁盤特定扇區的文件系統超級塊或系統控制塊。
super_block
http://lxr.free-electrons.com/source/include/linux/fs.h?v=3.11#L1242
super_operations
http://lxr.free-electrons.com/source/include/linux/fs.h?v=3.11#L1604

索引節點對象

代表一個具體文件,包含了內核在操作文件或目錄時需要的全部信息,由inode結構體表示,定義於
unix風格的文件系統可以直接從磁盤索引節點讀入,如果一個文件系統沒有索引節點,文件系統需要從磁盤上提取相關信息(沒有inode的文件系統通常將文件描述信息作為文件的一部分)索引節點必須在內存中創建,以便於文件系統使用包含操作對象inode_operations對象,包括針對特定文件所能調用的方法,定義於 索引節點代表文件系統中的一個文件(但索引節點僅當文件被訪問時,才在內存中創建),也可以是設備管道這樣的特殊文件
inode
http://lxr.free-electrons.com/source/include/linux/fs.h?v=3.11#L523
inode_operations
http://lxr.free-electrons.com/source/include/linux/fs.h?v=3.11#L1559 目錄項對象
代表一個目錄項,是路徑的一個組成部分,由dentry結構體表示,定義於 包含dentry_operations對象,其中包括內核針對特定目錄所能調用的方法,定義 VFS把目錄當文件對待,路徑中的每一個組成部分都由一個索引節點對象表示。為方便查找操作,vfs引入目錄項,每個dentry代表路徑中的一個特定部分,/bin/vi,這個路徑,/,bin,vi(文件)都是目錄項對象。目錄項也可包括安裝點,/mnt/cdrom/foo,構成元素/,mnt,cdrom,foo都是目錄項 vfs在執行目錄操作時,如果需要會現場創建目錄項對象。目錄學沒有對應的磁盤數據結構,vfs根據字符串路徑名現場創建目錄項緩存在目錄項緩存dcache中,以加速查找操作
dentry
http://lxr.free-electrons.com/source/include/linux/dcache.h?v=3.11#L106
dentry_operations
http://lxr.free-electrons.com/source/include/linux/dcache.h?v=3.11#L148 文件對象
代表由進程打開的文件,由file結構體表示,定義於 包含file_operations對象,其中包括進程針對已經打開的文件所能調用的方法,定義於 多個進程可以同時打開和操作同一個文件,所以同一個文件可能對應多個文件對象。文件對象僅在進程觀點上代表已打開文件,它反過來指向dentry(反過來指向inode),只有目錄項才代表打開的實際文件。文件對應的文件對象不是唯一的,但對應的索引節點和目錄項對象和文件是唯一的。
file
http://lxr.free-electrons.com/source/include/linux/fs.h?v=3.11#L765
file_operations
http://lxr.free-electrons.com/source/include/linux/fs.h?v=3.11#L1528
因為VFS將目錄作為一個文件來處理,所以不存在目錄對象。

其他相關數據結構

和文件系統相關的數據結構

file_system_type
用來描述各種特定文件系統,定義於,如ext3,ext4 每種文件系統,不論是否被安裝,都只有一個file_system_type結構體
kernel 3.11
struct file_system_type {
         const char *name;
         int fs_flags;
#define FS_REQUIRES_DEV         1 
#define FS_BINARY_MOUNTDATA     2
#define FS_HAS_SUBTYPE          4
#define FS_USERNS_MOUNT         8       //Can be mounted by userns root 
#define FS_USERNS_DEV_MOUNT     16 // A userns mount does not imply MNT_NODEV 
#define FS_RENAME_DOES_D_MOVE   32768   /* FS will handle d_move() during rename() internally. */
         struct dentry *(*mount) (struct file_system_type *, int,const char *, void *);
        void (*kill_sb) (struct super_block *);
        struct module *owner;
        struct file_system_type * next;
        struct hlist_head fs_supers;

        struct lock_class_key s_lock_key;
        struct lock_class_key s_umount_key;
        struct lock_class_key s_vfs_rename_key;
        struct lock_class_key s_writers_key[SB_FREEZE_LEVELS];

        struct lock_class_key i_lock_key;
        struct lock_class_key i_mutex_key;
        struct lock_class_key i_mutex_dir_key;
};
vfsmont
用來描述一個安裝文件系統的實例,定義於 文件系統被實際安裝時,一個vfsmount結構在安裝點創建,代表文件系統的實例,換句話說,代表安裝點。
struct vfsmount {
     struct dentry *mnt_root;/* root of the mounted tree */
     struct super_block *mnt_sb;/* pointer to superblock */
     int mnt_flags;
};

和進程相關的數據結構

file_struct
定義於 與單個進程相關的信息都包含在內
fs_struct
定義於 包含文件系統和進程相關信息
namespace
定義於
使得每一個進程在系統中看到唯一的安裝文件系統,不僅是唯一的根目錄,而是唯一的文件系統層次結構

Linux存儲棧

這裡寫圖片描述


Copyright © Linux教程網 All Rights Reserved