《Linux内核设计与实现》笔记(十三)

(十三)虚拟文件系统

虚拟文件系统作为内核子系统,为用户空间程序提供了文件和文件系统相关的接口。系统中所有文件系统不但依赖VFS共存,而且也依靠VFS系统协同工作。通过虚拟文件系统,程序可以利用标准的Unix系统调用对不同的文件系统,甚至不同介质上的文件系统进行读写操作。

通用文件系统接口

VFS使得用户可以直接使用open()、read()和write()这样的系统调用而无须考虑具体文件系统和实际物理介质。

它把各种不同的文件系统抽象后采用统一的方式进行操作。

文件系统抽象层

之所以可以使用这种通用接口对所有类型的文件系统进行操作,是因为内核在它的底层文件系统接口上建立了一个抽象层。

Linux可以支持很多种差异很大的文件系统,从DOS系统的FAT到Windows系统的NTFS,再到各种Unix风格文件系统和Linux特有的文件系统。

VFS抽象层之所以能衔接各种各样的文件系统,是因为它定义了所有文件系统都支持的、基本的、概念上的接口和数据结构,实际文件系统通过编程提供VFS所期望的抽象接口和数据结构。

VFS对象及其数据结构

VFS其实采用的是面向对象的设计思路,使用一组数据结构来代表通用文件对象,这些数据结构类似于对象。

VFS中有四个主要的对象类型:

  1. 超级块对象,代表一个具体的已安装文件系统。
  2. 索引节点对象,代表一个具体文件。
  3. 目录项对象,代表一个目录项,是路径的一个组成部分。
  4. 文件对象,代表由进程打开的文件。

超级块对象

各种文件系统都必须实现超级块对象,该对象用于存储特定文件系统的信息,通常对应于存放在磁盘特定扇区中的文件系统超级块或文件系统控制块。对于并非基于磁盘的文件系统(如基于内存的文件系统,比如sysfs),它们会在使用现场创建超级块并将其保存到内存中。

索引节点对象

索引节点对象包含了内核在操作文件或目录时需要的全部信息,必须在内存中创建,以便于文件系统使用。

一个索引节点代表文件系统中(但是索引节点仅当文件被访问时,才在内存中创建)的一个文件,它也可以是设备或管道这样的特殊文件。

目录项对象

VFS把目录当作文件对待,所以在路径/bin/vi中,bin和vi都属于文件——bin是特殊的目录文件而vi是一个普通文件,路径中的每个组成部分都由一个索引节点对象表示。虽然它们可以统一由索引节点表示,但是VFS经常需要执行目录相关的操作,比如路径名查找等。路径名查找需要解析路径中的每一个组成部分,不但要确保它有效,而且还需要再进一步寻找路径中的下一个部分。为了方便查找操作,VFS引入了目录项的概念。

在路径中,每一个部分都是目录项对象。解析一个路径并遍历其分量绝非简单的演练,它是耗时的、常规的字符串比较过程,执行耗时、代码繁琐。目录项对象的引入使得这个过程更加简单。

目录项没有对应的磁盘数据结构,VFS根据字符串形式的路径名现场创建它。

时间局部性:当一个文件被访问时,所缓存的相关目录项和索引节点不久被命中的概率较高。
空间局部性:一个文件对应的目录项缓存后极有可能被命中,因为相关的文件可能在下次又被使用。

文件对象

文件对象表示进程已打开的文件。进程直接处理的是文件,而不是超级块、索引节点、目录项。

文件对象是已打开的文件在内存中的表示。该对象由相应的open()系统调用创建,由close()系统调用撤销,所有这些文件相关的调用实际上都是文件操作表中定义的方法。因为多个进程可以同时打开和操作同一个文件,所以同一个文件也可能存在多个对应的文件对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值