虚拟文件系统(Virtual File System,VFS)
Linux虚拟文件系统
Linux包含一个通用的、强有力的文件处理机制,该机制利用虚拟文件系统(Virtual File System,VFS)来支持大量的文件管理系统和文件结构。
- VFS向用户进程提供了一个简单的,统一的文件系统接口。
- VFS定义了一个能代表任何可想到的文件系统的通用特征和行为的通用文件模型。
- VFS认为文件是计算机大容量存储器上的对象。这些计算机大容量存储器具有共同的特征,这与目标文件系统或底层的处理器硬件无关。
- 文件有一个符号名,以便在一个文件系统的特定目录下能唯一地标识该文件。
- 同时文件有一个所有者、对未授权的访问或修改的保护和其他一系列属性。
- 文件可以被创建、从中读、向它写或删除。
- 对于任何特定文件系统,需要一个映射模块来转换实际文件系统的特征到虚拟文件系统所期望的特征。
图12.17展示了Linux文件系统策略的关键组成成分。
- 用户进程通过使用VFS文件方案来发起文件系统调用。
- VFS通过特定文件系统的一个映射函数转换该系统调用到内部的一个特定文件系统的功能调用(例如IBM的JFS)。
- 在很多情况下,映射函数仅仅是一个方案的文件系统功能调用到另一个方案的文件系统功能调用的映射。
- 在某些情况下,映射函数会比较复杂。例如,一些文件系统使用存储目录树中每个文件位置的文件分配表。在这些文件系统中,目录并不是文件。这些文件系统的映射函数必要时必须能动态创建与目录相对应的文件。在任何情况下,原来用户的文件系统调用必须转换成目标文件系统的调用。这样就调用了目标文件系统的相应功能去完成在文件或目录上的相应请求,该操作的结果以类似的方式返回给用户进程。
VFS在 Linux内核中所起的作用如图12.18所示。当进程发起一个面向文件的系统调用时,内核调用VFS 中的一个函数。该函数处理完与具体文件系统无关的操作后,调用目标文件系统中的相应函数。这个调用通过一个转换VFS的调用到目标文件系统调用的映射函数来实现。VFS独立于任何具体文件系统。因此映射函数的实现是文件系统在Linux上的实现的一部分。目标文件系统转换文件系统请求到面向设备的指令。
VFS是一个面向对象的方案。因为VFS不是用支持面向对象的语言(如C++和 Java)来实现的,而是使用C语言来实现的,因此VFS的对象可以简单地实现为C语言的结构。每一个对象包含数据和函数指针。这些函数指针指向操作这些数据的文件系统的实现函数。VFS主要的四个对象如下:
- 超级块对象:代表一个特定的已挂接的文件系统。
- 索引节点对象:代表一个特定的文件。
- 目录对象:代表一个特定的目录项。
- 文件对象:代表一个与进程相关的打开的文件。
这个方案是基于UNIX文件系统中所使用的概念的。
UNIX文件系统的关键概念如下。一个文件系统由层次目录组成。目录的概念和许多非UNIX平台中的文件夹是一样的,可以包含文件和其他目录。由于一个目录可能包含其他目录,因此就形成了一个树结构。在树结构中从根开始的路径由一系列目录项组成,最后以目录项或文件名结束。在UNIX中,目录是用一个列出了该目录所包含的文件名和目录的文件来实现的。因此,文件操作能同时应用于文件或目录。
超级块对象
超级块存储了描述特定文件系统的信息。通常,超级块对象对应了位于磁盘上特定扇区的文件系统超级块或文件系统控制块。
超级块对象由许多数据项组成,如下所示:
- 该文件系统所挂接的设备。
- 文件系统的基本块大小。
- 脏标志,表示超级块已经修改过,但还没有写回到磁盘。
- 文件系统类型。
- 标志,如只读标志。
- 指向文件系统根目录的指针。
- 打开文件列表。
- 控制访问该文件系统的信号量。
- 操作超级块的函数指针数组的指针。
上面列出的最后一项是一个包含在超级块对象中的操作对象。该操作对象定义了内核可在超级块对象上调用的对象方法(函数)。为超级块对象定义的方法包括:
- read_inode:从一个已挂接的文件系统上读一个特定的索引节点。
- wrie_inode:把给定的索引节点写回到磁盘。
- put_inode:释放索引节点。
- delete_inode:从磁盘上删除索引节点。
- notify _inode:当索引节点的属性发生变化时调用。
- putauper:当VFS卸载一个给定的超级块时调用。
- write_super:当VFS决定把超级块写回到磁盘时调用。
- statfs:获取文件系统的统计信息。
- remount_fa:当文件系统重新挂接时调用。
- clear_inode:释放索引节点,同时清除任何包含相关数据的页。
索引节点对象
一个索引节点与一个文件相关联。索引节点对象包含一个命名文件的除了该文件的文件名和该文件的实际数据内容外的所有信息。索引节点中包含由所有者、组、权限、文件的访问时间、数据长度和链接数等信息。
索引节点对象包含一个描述VFS 能在该索引节点上调用的文件系统的实现函数的索引节点操作对象。索引节点操作对象中定义了如下的函数:
- create:为与某一目录下的目录项对象相关联的普通文件创建一个新的索引节点。
- lookup:为对应于一个文件名的索引节点查找一个目录。
- mkdir:为与某一目录下的目录项对象相关联的目录创建一个新的索引节点。
目录项对象
目录项(directory entry,dentry)对象是一个路径上的一个特定的组成。该组成或者是一个目录名或文件名。目录对象为访问文件和目录提供了方便。目录项对象包括一个指向索引节点的指针和超级块。它还包括一个指向父目录的指针和指向子目录的指针。
文件对象
文件对象代表一个进程所打开的一个文件。文件对象在系统调用open()时创建,在系统调用close()时销毁。文件对象包含如下一些数据项:
- 与该文件相关联的目录对象。
- 包含该文件的文件系统。
- 文件对象使用计数。
- 用户ID。
- 用户组ID。
- 文件指针,指向下–个文件操作所要作用到的位置。
文件对象包含一个描述VFS能在该文件对象上调用的文件系统的实现函数的文件操作对象。该对象包含的函数有read、write、open、release和lock。
虚拟文件系统(Virtual File System,VFS)相关推荐
- 星际文件系统(InterPlanetary File System,缩写IPFS)
星际文件系统(InterPlanetary File System,缩写IPFS)是个旨在创建持久且分布式存储和共享文件的络传输协议.它是一种内容可寻址的对等超媒体分发协议.在IPFS网络中的节点将构 ...
- adb 文件传输,解决只读文件系统Read-only file system问题
操作代码: adb push C:\xxdir\project /sdcard/xxx 执行此行代码,有可能会报错:错误如下 failed to copy './xxx' to '/xxx/xxx': ...
- VFS(virtual File System) 虚拟文件系统
采用标准的Unix系统调用读写位于不同物理介质上的不同文件系统,即为各类文件系统提供了一个统一的操作界面和应用编程接口.VFS是一个可以让open().read().write()等系统调用不用关心底 ...
- linux一切皆是文件_Linux 的虚拟文件系统(真正理解“一切皆文件”)
1,引言 Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等.通过使用同一套文件 I/O 系统 调用即可对 Linux 中的任意文件进行操作而无需考虑其所在的具体文件系 ...
- Linux虚拟文件系统:数据结构与文件系统注册、文件打开读写
数据结构 超级块 - super_block 索引节点 - inode 目录项 - dentry 文件结构 - file 虚拟文件系统实现 注册文件系统 - register_filesystem 打 ...
- 【Linux 内核】Linux 操作系统结构 ( Linux 内核在操作系统中的层级 | Linux 内核子系统及关系 | 进程调度 | 内存管理 | 虚拟文件系统 | 网络管理 | 进程间通信 )
文章目录 一.Linux 内核在操作系统中的层级 二.Linux 内核子系统 三.Linux 内核子系统之间的关系 一.Linux 内核在操作系统中的层级 Linux 内核 所在层级 : 整个计算机系 ...
- Linux虚拟文件系统VFS的相关数据结构和操作
最近看到几篇介绍VFS的韩语文章,觉得里面的众多绘图清晰易懂,冒昧将其摘选出来,分享给大家,希望大家可以从更多的角度去理解和认识VFS的构成和原理.原文地址位于 https://m.blog.nave ...
- Linux文件系统二(虚拟文件系统VFS实现原理)
创作人QQ:851301776,邮箱:lfr890207@163.com 欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1 ...
- linux文件体系结构和虚拟文件系统
linux中的虚拟文件系统(Virtual File System, VFS)是一种采用面向对象编程策略(尽管书写操作系统的C语言本身不支持面向对象编程,但是思想还是可以借鉴的),是对该操作系统所支持 ...
- linux VFS 虚拟文件系统 简介 super_block inode dentry file
1.简介 1.Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等.通过使用同一套文件 I/O 系统 调用即可对 Linux 中的任意文件进行操作而无需考虑其所在的具体文 ...
最新文章
- 【CV】吴恩达机器学习课程笔记第11章
- WEB应用程序逻辑架构
- linux主机重启之后,报UNEXPECTED INCOMSISTEMCY:RUN fsck MANUALLY.
- 042 实例10-文本词频统计
- mysql英文怎么发音_英文字母和汉语拼音先学哪个?科学答案在这里
- 涉密计算机用户密码操作规程,涉密计算机管理设置密码
- 第二工业大学计算机应用大专录取分,二工大| 2018年上海第二工业大学专科层次依法自主招生各专业最低录取分数线...
- 手机重装android系统,安卓手机系统怎么重装(刷机)
- 企业邮箱哪个最好用?企业邮箱哪个安全?
- Linux设备模型分析之device_driver(基于3.10.1内核)
- 运放微分、积分电路的本质以及电容的阴谋
- 父子进程终止顺序与僵死进程
- 论对B/S模式外贸电子商务系统的规划和设计
- 微信小程序上传图片到阿里云oss方法
- EXCEL表格 显示 超长 数字 E+ 变成 文本格式,数字全部显示
- 邓迪大学信息无障碍典型文献技术剖析
- 壬辰年癸丑月丁亥日记梦
- 计算机视觉中transformer的理解
- C# 将Base64转换为图片并保存到Image数组
- xubuntu20.04+virtualbox6+direct3d安装吃屎记