003 虚拟文件系统VFS基本数据结构

Linux支持多种文件系统,这些具体的文件系统并不是直接都挂载到系统中的,实际上是按需挂载的,这些文件系统只有挂载到系统中,VFS才能够真正管理起来,否则如果只是注册,不会产生任何文件系统实例。

文件系统挂载(安装)后,将会产生多个数据结构实例,挂载过程实际上就是构造这些数据结构实例的过程。Linux在文件系统的设计中,汲取了Unix的设计思想,抽象出四个基本数据结构:超级块(super_block),索引节点(inode),目录项(directory entry)和文件对象(file)

文件系统主要数据结构
文件系统主要数据结构

一、基本数据结构

超级块(super_block):存放系统中已挂载文件系统的有关信息,同一个文件系统如果被挂载多次,将会产生多份超级块实例

索引节点(inode,index node): 存放具体文件的一般信息,同时归集了文件的操作表,通过inode可以访问文件属性,操作具体文件

目录项(dentry,directory entry):文件目录树的组成部分,不管是目录还是普通的文件,都是一个目录项对象,目录项只有内存结构,它是文件树的缓存,通过目录项可以快速找到索引节点

文件(file):存放打开文件与进程之间进行交互的有关信息

数据结构
(fs.h、dcache.h)
主要内容结构说明
超级块(super_block)存放系统中已挂载文件系统的有关信息:
文件系统类型s_type
超级块方法:s_op
超级块链表指针:s_list
该类型的超级块列表指针:s_instance
1)超级块用来描述整个文件系统的信息,每个具体的文件系统都有各自的超级块
2)超级块物理结构,一般是文件系统的第一个block
3)超级块是各种具体文件系统在安装时建立的,并在卸载时被自动删除
4)所有超级块对象以双向环形链表的形式链接在一起
5)与超级块关联的方法就是超级块操作表,这些操作是由数据结构super_operations来描述
索引节点(inode)索引节点对象存储了
文件的一般信息,代表了
存储设备上的一个实际的
物理文件:
编号i_ino
所属用户i_uid
用户组i_gid
atime
ctime
mtime
对应的超级块i_sb
操作表i_op
1)当一个文件首次被访问时,内核会组装相应的索引节点对象,以便向内核提供对一个文件进行操作时所必需的全部信息;
2)inode信息一部分存储在磁盘特定位置(存储结构),一部分是在加载时动态填充的,所以inode要占用存储空间(内存结构)。
目录项(dentry)文件目录树的组成部分,不管是目录还是普通的文件,都是一个目录项对象,便于索引节点的查找:
文件名d_name
父目录项d_parent
父目录的子项d_child
当前目录子目录d_subdirs
操作表d_op
对应的索引节点d_inode
对应的超级块:d_sb
1)引入目录项的概念主要是出于方便查找文件的目的。
2)一个路径的各个组成部分,不管是目录还是普通的文件,都是一个目录项对象。
3)目录项没有对应的磁盘数据结构,所以不占用存储空间,VFS在遍历路径时,现场将它们逐个地解析成目录项对象,放到内存中管理。
文件(file)文件对象是已打开的文件在内存中的表示,主要用于
建立进程和磁盘上的文件的对应关系:
文件信息f_path包含两部分1)对应的文件系统vfsmount *mnt
2)对应的目录项dentry *dentry
操作表:f_op
1)文件对象它由sys_open()现场创建,由sys_close()销毁。
2)文件对象和物理文件的关系有点像进程和程序的关系一样。
3)当我们站在用户空间来看待VFS,我们只需与文件对象打交道,而无须关心超级块,索引节点或目录项。
4)因为多个进程可以同时打开和操作同一个文件,所以同一个文件也可能存在多个对应的文件对象。
5)一个文件对应的文件对象可能不是惟一的,但是其对应的索引节点和目录项对象是惟一的。
文件系统主要数据结构

二、完整结构关系图

结构体关系图

链接:查看原图

上一篇:Linux内核中虚拟文件系统VFS组织方式

参考资料:

《003 虚拟文件系统VFS基本数据结构》有3个想法

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注