linux内核分析之虚拟文件系统
扫描二维码
随时随地手机看文章
本文主要是介绍一下linux内核的虚拟文件系统(VFS)。虚拟文件系统(VFS,virtual filesystem),是一个内核软件层,是物理文件系统与服务之间的一个接口层,它对Linux的每个文件系统的所有细节进行抽象,使得不同的文件系统在Linux核心以及系统中运行的其他进程看来,都是相同的。
严格说来,VFS并不是一种实际的文件系统。它只存在于内存中,不存在于任何外存空间。VFS在系统启动时建立,在系统关闭时消亡。 Linux中系统可以使用连接成单一树形结构的不同文件系统。VFS可以无缝地使用多个不同的文件系统,通过VFS可以访问文件系统的系统调用提供一个统一的抽象接口,支持多种文件系统。
VFS的作用是采用标准的UNIX系统调用读/写位于不同物理介质上的不同文件系统,方便的在不同文件系统间进行数据交换和管理。 Linux系统中,VFS使用4个主要对象:超级块、索引节点、目录项、文件对象。每个对象的数据结构中不仅包含了属性还包含了对应的操作。
1、超级块
超级块用于存储已安装文件系统的控制信息的数据结构,代表已安装的文件系统,一个安装实例和一个超级块是一一对应关系。超级块描述文件系统的状态、文件系统类型、大小、区块数、索引节点数等,存放在磁盘的特定扇区中。 超级块使用结构体super_block表示。
(1)变量s_list指向超级块链表的指针,同一时间内核会拥有好几个文件系统的超级块,内核采用双向循环链表的方式来组织这些超级块。
(2)变量s_root指针指向目录项的根目录。
2、索引节点
存储文件的元数据的一种结构,文件的元数据就是文件的相关信息,和文件本身是两种概念。它包含诸如文件大小、拥有者、创建时间、磁盘位置等和文件相关的信息。 每个索引节点都有一个索引节点号,唯一的标识文件系统中的文件。索引节点在文件的整个生命周期都存在。
索引节点使用结构体inode来表示。
(1)变量i_hash包含了一个指向哈希链表的指针,哈希表加速索引节点的查找。
(2)i_ino保存一个索引号,唯一标识。
(3)变量i_sb指针指向文件所驻留的文件系统的超级块。
3、目录项(dentry)
存放目录项(文件的特定名称)与对应文件进行链接的有关信息。在一个文件路径中,路径中的每一部分都被称为目录,如/home/source/hello.c中,目录/,home,source和文件hello.c都是一个目录项。
目录项使用结构体struct dentry来表示。
4、文件对象
文件对象表示进程已打开的一个文件,它是已打开文件在内存中的表示。多进程可能同时打开同一文件,内存中可能存在多个与同一文件对应的文件对象,但与该文件对应的索引节点和目录项是唯一的。
文件对象使用结构体struct file来表示。
5、四者的关系