首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

细说 Linux 虚拟文件系统原理

在 Unix 的世界里,有句很经典的话:一切对象皆是文件。这句话的意思是说,可以将 Unix 操作系统中所有的对象都当成文件,然后使用操作文件的接口来操作它们。Linux 作为一个类 Unix 操作系统,也努力实现这个目标。

虚拟文件系统简介

为了实现??这个目标,Linux 内核提供了一个中间层:。

如果大家使用过面向对象编程语言(如C++/Java等)的话,应该对??这个概念并不陌生。而虚拟文件系统类似于面向对象中的接口,定义了一套标准的接口。开发者只需要实现这套接口,即可以使用操作文件的接口来操作对象。如下图所示:

上图中的蓝色部分就是虚拟文件系统所在位置。

从上图可以看出,虚拟文件系统为上层应用提供了统一的接口。如果某个文件系统实现了虚拟文件系统的接口,那么上层应用就能够使用诸如?、?和??等函数来操作它们。

今天,我们就来介绍虚拟文件系统的原理与实现。

虚拟文件系统原理

在阐述虚拟文件系统的原理前,我们先来介绍一个 Java 例子。通过这个 Java 例子,我们能够更容易理解虚拟文件系统的原理。

一个Java例子

如果大家使用过 Java 编写程序的话,那么就很容易理解虚拟文件系统了。我们使用 Java 的接口来模拟虚拟文件系统的定义:

上面定义了一个名为??的接口,接口中定义了一些方法,如?、?和??等。现在我们来定义一个名为??的对象来实现这个接口:

现在我们就能使用??接口来操作??对象了,如下代码:

从上面的例子可以看出,底层对象只需要实现??接口,就可以使用??接口相关的方法来操作对象,用户完全不需要了解底层对象的实现过程。

虚拟文件系统原理

上面的 Java 例子已经大概说明虚拟文件系统的原理,但由于 Linux 是使用 C 语言来编写的,而 C 语言并没有接口这个概念。所以,Linux 内核使用了一些技巧来模拟接口这个概念。

下面来介绍一下 Linux 内核是如何实现的。

1. file结构

为了模拟接口,Linux 内核定义了一个名为??的结构体,其定义如下:

在 file 结构中,最为重要的一个字段就是?,其类型为??结构。而??结构是由一组函数指针组成,其定义如下:

从??结构的定义可以隐约看到接口的影子,所以可以猜想出,如果实现了??结构中的方法,应该就能接入到虚拟文件系统中。

在 Linux 内核中,?结构代表着一个被打开的文件。所以,只需要将??结构的??字段设置成不同文件系统实现好的方法集,那么就能够使用不同文件系统的功能。

这个过程在??函数中实现,如下所示:

设置好??结构的??字段后,虚拟文件系统就能够使用通用的接口来操作此文件了。调用过程如下:

2. file_operations结构

底层文件系统需要实现虚拟文件系统的接口,才能被虚拟文件系统使用。也就是说,底层文件系统需要实现??结构中的方法集。

一般底层文件系统会在其内部定义好??结构,并且填充好其方法集中的函数指针。如??就定义了一个名为??的??结构。其定义如下:

也就是说,如果当前使用的是 minix 文件系统,当使用??函数读取其文件的内容时,那么最终将会调用??函数来读取文件的内容。

3. dentry结构

到这里,虚拟文件系统的原理基本分析完毕,但还有两个非常重要的结构要介绍一下的:?和?。

结构表示一个打开的目录项,当我们打开文件??文件时,内核会为文件路径中的每个目录创建一个??结构。如下图所示:

可以看到,?结构有个指向??结构的指针,如下所示:

与文件类似,目录也有相关的操作接口,所以在??结构中也有操作方法集,如下所示:

其中的??字段就是目录的操作方法集。

内核在打开文件时,会为路径中的每个目录创建一个??结构,并且使用??字段来指向其父目录项,这样就能通过??字段来追索到根目录。

4. inode结构

在 Linux 内核中,?结构表示一个真实的文件。为什么有了??结构还需要??结构呢?这是因为 Linux 存在硬链接的概念。

例如使用以下命令为??文件创建一个硬链接:

现在??和??指向同一个文件,但它们的路径是不一样的。所以,就需要引入??结构了。如下图所示:

由于??和??指向同一个文件,所以它们都使用同一个??对象。

inode 结构保存了文件的所有属性值,如文件的创建时间、文件所属用户和文件的大小等。其定义如下所示:

我们注意到 inode 结构有个类型为??结构的字段?,这个字段保存了文件的操作方法集。当用户调用??系统调用打开文件时,内核将会使用??结构的??字段赋值给??结构的??字段。我们再来重温下赋值过程:

总结

本文主要介绍了??的基本原理,从分析中可以发现,虚拟文件系统使用了类似于面向对象编程语言中的接口概念。正是有了?,Linux 才能支持各种各样的文件系统。

- EOF -

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230220A02NOQ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com