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 的接口,找到对应文件的“目录节点”,然后调用该“目录节点”对应的 *** 作接口。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)