虚拟文件系统

348 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第34天,点击查看活动详情

在同一台计算机上同一个操作系统下,可能会使用多个不同的文件系统。例如,Windows允许某些磁盘分区使用NTFS文件系统,而另一些磁盘分区使用FAT32或者FAT16文件系统。Windows根据盘符启用恰当的文件系统。

UNIX/Linux则将多种文件系统整合到一个统一的结构框架中,该结构框架就是虚拟文件系统(Virtual File System,VFS)。VFS定义了一个代表不特定文件系统通用特征和行为的文件模型。VFS的关键思想是抽象出所有文件系统的公共部分,形成一个简单、统一的抽象文件系统接口并提供给用户。用户仅通过抽象文件系统接口层表达文件操作意图,文件操作的具体执行则由底层的实际文件系统来完成。从抽象文件系统到某一具体文件系统的转换工作由映射模块来完成。VFS可以支持大量的文件系统和文件结构。

VFS有两个不同的接口:提供给用户进程的上层抽象接口和提供给实际文件系统的下层接口。

具体文件系统经由注册建立该文件系统到VFS的映射关系。在系统启动时VFS环境即可创建,根文件系统在VFS中注册。用户对其他文件系统的装载也是一个向VFS注册的过程。文件系统注册的主要工作是提供一个包含VFS所需要的文件操作函数地址列表,建立VFS抽象函数与具体文件系统操作函数之间的绑定关系。

当开发一个新的文件系统时,设计者首先获得一个VFS期待的功能调用列表,然后在新文件系统中实现这些功能。如果文件系统已经存在,则对该文件系统中的文件操作功能进行封装,将其改造为符合VFS接口规范的功能集合。

VFS是一个面向对象的方案,每个对象包含数据和函数指针。这些函数指针指向操作这些数据的文件系统的实现函数。VFS的4个主要对象如下。 1.超级块对象 超级块对象:代表一个特定的已挂载的文件系统。 超级块对象对应位于磁盘上特定扇区的文件系统超级块或文件系统控制块。超级块对象包含的典型数据项如下。

    1. (1)该文件系统所挂接的设备。
    1. (2)文件系统的基本块大小。
    1. (3)修改标志,表示超级块已经修改过,但还未写回磁盘。
    1. (4)文件系统类型。
    1. (5)访问控制标志,如只读标志。
    1. (6)指向文件系统根目录的指针。
    1. (7)打开文件链表。
    1. (8)文件系统访问控制信号量。
    1. (9)操作超级块的函数指针数组的指针,这些函数实现的功能如下。
  • ① 从一个已挂接文件系统上读一个特定的索引节点(read_inode)。
  • ② 把给定的索引节点写回磁盘(write_inode)。
  • ③ 释放索引节点(put_inode)。
  • ④ 从磁盘上删除索引节点(delete_inode)。
  • ⑤ 索引节点属性发生变化(notify_inode)。
  • ⑥ 超级块卸载(put_super)。
  • ⑦ 将超级块写回磁盘(write_super)。
  • ⑧ 获取文件系统统计信息(statfs)。
  • ⑨ 重新挂接文件系统(remount_fs)。
  • ⑩ 释放索引节点,同时清除包含相关数据的页。 2.索引节点对象 索引节点对象:代表一个特定的文件。 每个文件都关联一个索引节点。索引节点对象包含除文件名和文件内容以外的某个文件的所有信息,即文件属性信息,包括所有者、组、权限、文件访问时间、数据长度和链接数等。索引节点对象定义如下操作函数。 (1)为普通文件创建索引节点(create):为目录项关