虚拟文件系统的Linux虚拟文件系统简介

虚拟文件系统的Linux虚拟文件系统简介,第1张

虚拟二字主要有两层含义:

1,

在同一个目录结构中,

可以挂载着若干种不同的文件系统.

VFS隐藏了它们的实现细节,

为使用者提供统一的接口;

2,

目录结构本身并不是绝对的,

每个进程可能会看到不一样的目录结构.

目录结构是由地址空间(namespace)来描述的,

不同的进程可能拥有不同的namespace,

不同的namespace可能有着不同的目录结构(因为它们可能挂载了不同的文件系统)。

含义:

索引节点,

对应设备上存放的一个文件。

创建:

1)在超级块被载入时,

作为根的inode一并被载入

2)通过mknod调用创新新的索引节点

3)在寻找文件路径的过程中,

从设备中读取,

并初始化(跟super_block一样,

inode结构中一部分信息是保存在设备中的,

一部分则是在内在中初始化的)。

函数:

i_op,

索引节点函数集,

主要包含对子inode的创建,

删除等 *** 作.

f_op,

文件函数集,

主要包含对本inode的读写等 *** 作.

在inode被创建后,

1)如果是特殊文件,

则根据对应文件的类型(包括块设备,

字符设备,

fifo,

等等)赋予特定的函数集(并不直接与设备和文件系统类型相关)

2)否则,

对应的文件系统类型会提供相应的函数集,

并且目录和文件函数集很可能不同。

VFS的使用者是进程(用户访问文件系统总是需要启动进程).

描述进程的task_struct结构中files指针指向了一个files_struct结构,

后者描述了进程已打开的文件集合。

files_struct结构维护了一个已打开文件所对应的file结构的指针数组,

数组下标被用作用户程序 *** 作已打开文件的句柄(通常称作fd).

files_struct还维护着已使用的fd位图,

以便在需要打开文件时,

为其分配一个未使用的fd。

详细见参考文献。

Linux

允许众多不同的文件系统共存,并支持跨文件系统的文件 *** 作,这是因为有虚拟文件系统的存在。虚拟文件系统,即VFS(Virtual File

System)是 Linux 内核中的一个软件抽象层。它通过一些数据结构及其方法向实际的文件系统如 ext2,vfat

提供接口机制。本文在简要介绍 VFS 的相关数据结构后,以文件 I/O 为切入点深入 Linux 内核源代码,追踪了 sys_open 和

sys_read 两个系统调用的代码结构,并在追踪的过程中理清了跨文件系统的文件 *** 作的基本原理和“一切皆是文件”的口号得以实现的根本。

VFS

是一套代码框架(framework),它处于文件系统的使用者与具体的文件系统之间,将两者隔离开来。这种引入一个抽象层次的设计思想,即“上层不依赖

于具体实现,而依赖于接口;下层不依赖于具体实现,而依赖于接口”,就是著名的“依赖反转”,它在 Linux内核中随处可见。

VFS框架的设计,需要满足如下需求:

1、  为上层的用户提供统一的文件和目录的 *** 作接口,如  open, read, write

2、  为下层的具体的文件系统,定义一系列统一的 *** 作“接口”, 如 file_operations, inode_operations, dentry_operation,而具体的文件系统必须实现这些接口,才能融入VFS框架中。

为此,VFS 需要:

1、 定义一套文件系统的统一概念

2、 在这套概念基础上,实现提供给上层用户的 *** 作接口,如 open, read, write 等

3、 提供一套机制,让下层的具体的文件系统可融入 VFS 框架中,如文件系统的“注册”和“安装”

VFS核心概念

1、 VFS 通过树状结构来管理文件系统,树状结构的任何一个节点都是“目录节点”

2、 树状结构具有一个“根节点”

3、 VFS 通过“超级块”来了解一个具体文件系统的所有需要的信息。具体文件系统必须先向VFS注册,注册后,VFS就可以获得该文件系统的“超级块”。

4、 具体文件系统可被安装到某个“目录节点”上,安装后,具体文件系统才可以被使用

5、 用户对文件的 *** 作,就是通过VFS 的接口,找到对应文件的“目录节点”,然后调用该“目录节点”对应的 *** 作接口。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8981478.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存