1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Linux虚拟文件系统(VFS)

Linux虚拟文件系统(VFS)

时间:2024-03-28 17:44:53

相关推荐

Linux虚拟文件系统(VFS)

Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等。通过使用同一套文件 I/O 系统 调用即可对 Linux 中的任意文件进行操作而无需考虑其所在的具体文件系统格式;更进一步,对文件的 操作可以跨文件系统而执行。而虚拟文件系统正是实现上述两点 Linux 特性的关键所在。虚拟文件系统(Virtual File System, 简称 VFS), 是 Linux 内核中的一个软件层,用于给用户空间的程序提供文件系统接口;同时,它也提供了内核中的一个 抽象功能,允许不同的文件系统共存。系统中所有的文件系统不但依赖 VFS 共存,而且也依靠 VFS 协同工作。为了能够支持各种实际文件系统,VFS 定义了所有文件系统都支持的基本的、概念上的接口和数据 结构;同时实际文件系统也提供 VFS 所期望的抽象接口和数据结构,将自身的诸如文件、目录等概念在形式 上与VFS的定义保持一致。换句话说,一个实际的文件系统想要被 Linux 支持,就必须提供一个符合VFS标准 的接口,才能与 VFS 协同工作。实际文件系统在统一的接口和数据结构下隐藏了具体的实现细节,所以在VFS 层和内核的其他部分看来,所有文件系统都是相同的。

VFS和具体文件系统

虚拟文件系统(VFS)

为了支持不同的文件系统,必须将不同的文件系统的操作和管理纳入一个统一框架,使用户程序可以通过一个文件系统界面,(同一组系统调用)能够对不同文件系统和文件进行操作。从本质上讲,文件系统是特殊的数据分层存储结构,它包含文件、目录和相关的控制信息。为了描述 这个结构,Linux引入了一些基本概念:

文件 一组在逻辑上具有完整意义的信息项的系列。在Linux中,除了普通文件,其他诸如目录、设备、套接字等 也以文件被对待。总之,“一切皆文件”。

目录 目录好比一个文件夹,用来容纳相关文件。因为目录可以包含子目录,所以目录是可以层层嵌套,形成 文件路径。在Linux中,目录也是以一种特殊文件被对待的,所以用于文件的操作同样也可以用在目录上。

目录项 在一个文件路径中,路径中的每一部分都被称为目录项;如路径/home/source/helloworld.c中,目录 /, home, source和文件 helloworld.c都是一个目录项。

索引节点 用于存储文件的元数据的一个数据结构。文件的元数据,也就是文件的相关信息,和文件本身是两个不同 的概念。它包含的是诸如文件的大小、拥有者、创建时间、磁盘位置等和文件相关的信息。

超级块 用于存储文件系统的控制信息的数据结构。描述文件系统的状态、文件系统类型、大小、区块数、索引节 点数等,存放于磁盘的特定扇区中。

磁盘与文件系统

VFS数据结构

VFS依靠四个主要的数据结构和一些辅助的数据结构来描述其结构信息,这些数据结构表现得就像是对象; 每个主要对象中都包含由操作函数表构成的操作对象,这些操作对象描述了内核针对这几个主要的对象可以进行的操作。

超级块对象

存储一个已安装的文件系统的控制信息,代表一个已安装的文件系统;每次一个实际的文件系统被安装时, 内核会从磁盘的特定位置读取一些控制信息来填充内存中的超级块对象。一个安装实例和一个超级块对象一一对应。 超级块通过其结构中的一个域s_type记录它所属的文件系统类型。

struct super_block { //超级块数据结构struct list_head s_list;/*指向超级块链表的指针*/ …… struct file_system_type *s_type; /*文件系统类型*/ struct super_operations *s_op; /*超级块方法*/ …… struct list_head s_instances; /*该类型文件系统*/ ……};struct super_operations {//超级块方法 …… //该函数在给定的超级块下创建并初始化一个新的索引节点对象 struct inode *(*alloc_inode)(struct super_block *sb); …… //该函数从磁盘上读取索引节点,并动态填充内存中对应的索引节点对象的剩余部分 void (*read_inode) (struct inode *); ……};

索引节点对象

struct inode {//索引节点结构……struct inode_operations *i_op;/*索引节点操作表*/struct file_operations *i_fop; /*该索引节点对应文件的文件操作集*/struct super_block *i_sb;/*相关的超级块*/……};struct inode_operations { //索引节点方法…… //该函数为dentry对象所对应的文件创建一个新的索引节点,主要是由open()系统调用来调用int (*create) (struct inode *,struct dentry *,int, struct nameidata *);//在特定目录中寻找dentry对象所对应的索引节点struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *);……};

目录项对象

struct dentry {//目录项结构……struct inode *d_inode; /*相关的索引节点*/ struct dentry *d_parent; /*父目录的目录项对象*/ struct qstr d_name; /*目录项的名字*/ ……struct list_head d_subdirs;/*子目录*/ ……struct dentry_operations *d_op; /*目录项操作表*/ struct super_block *d_sb; /*文件超级块*/ ……};struct dentry_operations { //判断目录项是否有效; int (*d_revalidate)(struct dentry *, struct nameidata *); //为目录项生成散列值; int (*d_hash) (struct dentry *, struct qstr *); ……};

文件对象

struct file {……struct list_head f_list; /*文件对象链表*/ struct dentry*f_dentry; /*相关目录项对象*/ struct vfsmount *f_vfsmnt; /*相关的安装文件系统*/ struct file_operations *f_op; /*文件操作表*/ ……};struct file_operations { …… //文件读操作 ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); …… //文件写操作 ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); …… int (*readdir) (struct file *, void *, filldir_t); …… //文件打开操作 int (*open) (struct inode *, struct file *); ……};

对象间的联系以上的数据结构并不是孤立存在的。正是通过它们的有机联系,VFS才能正常工作。下图是对它们之间的联系的描述。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。