Linux支持多种文件系统类型的方式和其他类Unix系统类似,通过虚拟文件系统来实现。

  对每个读,写或其他操作文件系统的调用函数,内核都用实际支持各种文件系统的函数来代替。

  12.1 虚拟文件系统(VFS)的角色

  VFS是一个内核软件层,用来处理与标准Unix文件系统相关的全部系统调用。它主要作用是为多种文件系统提供通用接口。

  VFS是一个在应用程序和(实际的)文件系统实现之间的抽象层。

  VFS支持的文件系统可以分成三类:

    a.基于磁盘的文件系统Disk-based filesystems

      管理在本地磁盘或其他模拟磁盘的设备上的可用内存空间。

    b.网络文件系统Network filesystems

    c.特殊文件系统Special filesystems

      该文件系统不管理本地或者远端的磁盘空间。/proc文件系统就是一个典型的特殊文件系统。

  12.1.1 通用文件模型

  VFS背后的关键思想在于提出了能够代表全部所支持文件系统的通用文件模型(common file model)。

  然而,每个特定的文件系统实现必须把它的物理组织转变成VFS的通用文件模型。

  例如,在通用文件模型中,每个目录被当成是一个文件,包含了一列文件和其他目录。

  文件在内核内存中由file数据结构表征,该数据结构包含一个叫做f_op的成员,包含有指向特定文件系统函数实现的指针。

  通用文件模型包含以下几个对象类型:

    a.超级块Superblock

      存储一个已挂载文件系统的信息。对于基于磁盘的文件系统来说,该对象通常对应存储在磁盘上的文件系统控制块。

    b.索引节点inode

      存储一个指定文件的一般信息。对基于磁盘的文件系统,该对象通常对应存储在磁盘上的文件控制块。

    c.文件file

       存储进程和打开文件之间交互的信息。该信息只有进程打开文件期间存在于内核内存中。

    d.目录项dentry

       存储对应文件的目录入口的连接信息。

  图12-2阐述了一个简单例子关于进程如何跟文件交互。三个不同的进程打开了同一个文件,其中两个使用同一个硬链接。在次情况下,每个进程使用各自的file对象,同时为每个硬链接对应一个dentry对象。但是两个dentry对象都指的是同一个inode对象,inode对象标识了superblock对象和该通用磁盘文件。

  除了为所有的文件系统实现提供通用的接口,VFS在系统性能上也扮演了重要的角色。最近使用的dentry对象包含在称作dentry cache的磁盘缓存中,加快了从文件路径到文件索引节点的转换。

  通俗地讲,磁盘缓存是一种软件机制使得内核可以把通常存储在磁盘中的信息保存在RAM中,那么对该数据进一步地访问可以被迅速地满足而不用访问缓慢的磁盘。

  应当注意磁盘缓存如果区别于硬件缓存或者内存缓存,它们当中没有一个跟磁盘或者其它设备有关。硬件缓存是一个快速静态RAM,加速了向慢速动态RAM发出的请求。内存缓存是一个软件机制,用来绕过内核内存分配器(Kernel Memory Alloctor)。

  12.1.2 由VFS处理的系统调用

  我们在前面说过VFS是应用程序和特定文件系统之间的一层。然而在某些情况下,一个文件操作可以直接由VFS完成,而不需要调用到底层的代码。比如,当一个进程关闭了一个打开的文件,并不需要操作在磁盘上的该文件,因此VFS仅仅是释放对应的file对象。类似的,当lseek()系统调用修改了文件指针,作为一个打开文件和进程之间的交互属性,VFS也只需修改对应的file对象而不用访问磁盘上的文件,因此它不需要调用特定的底层代码。

  12.2 VFS数据结构

  所有的超级块对象都链在一个环形双向链表中,该链表的第一个元素是super_blocks变量。

  一般而言,由s_fs_info成员指向的数据是磁盘的信息,出于效率的考虑存放在内存中。每个基于磁盘的文件系统为了分配或者释放磁盘块需要访问并更新它的分配位图。VFS允许文件系统在不访问磁盘的情况下直接操作s_fs_info成员。

  这种方式会导致一个问题,VFS的超级块可能跟磁盘上对应的超级块没有同步。因此有必要引出s_dirt标志,表明该超级块是否是dirty,也就是磁盘上的数据是否需要更新。

  12.2.2 inode对象

  文件系统操作一个文件所需要的全部信息都包含在inode数据结构中。文件名字只是可以改变的一个标号,但是inode对文件来说是唯一的,只要文件存在,它就存在。

  当i_state成员的值等于I_DIRTY_SYNC,I_DIRTY_DATASYNC,或I_DIRTY_PAGES时,inode是dirty,也就意味着对应的磁盘inode必须更新。I_DIRTY宏可以用来检查这三个标志的值。i_state成员其它的值有I_LOCK(inode对象正被卷入I/O传输中),I_FREEING(inode对象已被释放),I_CLEAR(inode对象的内容已无意义),和I_NEW(inode对象已被分配但是还没有从磁盘inode读取内容填充它)。

  每个inode对象包含在超级块中以s_inodes成员为头结点的链表中;inode对象的i_sb_list成员存储了指向临近成员的指针。

  12.2.3 file对象

  存储在file对象中的最主要的信息是文件偏移指针,表明了下一次进程操作的位置。因为多个进程可能同时访问同一个文件,文件偏移指针必须保存在file对象中而不是inode对象中。

  

      

    

转载于:https://www.cnblogs.com/IrisZhou/p/3206818.html

[内核摘要] 虚拟文件系统相关推荐

  1. 深入linux内核架构--虚拟文件系统VFS

    [推荐阅读] Linux内核源码分析--内核启动之zImage自解压过程 你应该知道的Linux内核基础及内核编译 深入理解LINUX内核堆栈 [零声教育]vico老师教你怎么学习Linux内核 值得 ...

  2. linux内核之虚拟文件系统

    一.虚拟文件系统概述 虚拟文件系统VFS(也成虚拟文件交换)作为内核子系统,为用户空间程序提供了文件和文件系统相关的统一接口.通过VFS,应用程序可以使用相同接口完成不同介质上不同文件系统的数据读写操 ...

  3. Linux内核设计与实现笔记(一) 虚拟文件系统、块I/O层

    虚拟文件系统 系统内所有文件系统不但依赖VFS共存,而且也依靠VFS系统协同工作. VFS使得用户可以直接使用open/read/write等系统调用,而无需考虑具体文件系统和实际物理介质. VFS中 ...

  4. 【Linux 内核】Linux 操作系统结构 ( Linux 内核在操作系统中的层级 | Linux 内核子系统及关系 | 进程调度 | 内存管理 | 虚拟文件系统 | 网络管理 | 进程间通信 )

    文章目录 一.Linux 内核在操作系统中的层级 二.Linux 内核子系统 三.Linux 内核子系统之间的关系 一.Linux 内核在操作系统中的层级 Linux 内核 所在层级 : 整个计算机系 ...

  5. 【Linux 内核】Linux 内核特性 ( 组织形式 | 进程调度 | 内核线程 | 多平台虚拟内存管理 | 虚拟文件系统 | 内核模块机制 | 定制系统调用 | 网络模块架构 )

    文章目录 一.Linux 内核特性 1.Linux 内核组织形式 2.Linux 进程调度 3.Linux 内核线程 4.Linux 内核多平台虚拟内存管理 5.Linux 虚拟文件系统 6.Linu ...

  6. (转)linux内核虚拟文件系统浅析

    转自http://hi.baidu.com/_kouu/item/4e9db87580328244ef1e53d0 ###### 虚拟文件系统(VFS) 在我看来, "虚拟"二字主 ...

  7. 《Linux内核设计与实现》读书笔记(十三)- 虚拟文件系统

    虚拟文件系统(VFS)是linux内核和具体I/O设备之间的封装的一层共通访问接口,通过这层接口,linux内核可以以同一的方式访问各种I/O设备. 虚拟文件系统本身是linux内核的一部分,是纯软件 ...

  8. 文件系统(文件系统目录结构、磁盘分区、虚拟文件系统)、linux内核结构框图

    什么是文件系统? 常规认知就是根目录下那些文件,但其实并不是那样.文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构:即在存储设备 ...

  9. Linux内核设计与实现---虚拟文件系统

    虚拟文件系统 1 通用文件系统 2 文件系统抽象层 3 Unix文件系统 4 VFS对象及其数据结构 其他VFS对象 5 超级快对象 超级块操作 6 索引节点对象 索引节点操作 7 目录项对象 目录项 ...

最新文章

  1. 小白也能看懂的Matplotlib简明教程
  2. 嵌入式开发板老化过程中显示温度与负载的关系脚本的用法
  3. figma下载_切换到Figma并在其中工作不必是火箭科学,这就是为什么
  4. Request 对象 错误 'ASP 0104 : 80004005' 解决方法
  5. 为什么要从自然数扩大到实数,进而扩大到复数?
  6. RTX5 | 事件标志组03 - 线程同步(逻辑或)
  7. java printstream 覆盖了_Java PrintStream clearError()方法与示例
  8. Gradle 构建 android 应用常见问题解决指南
  9. sql2012下载,安装,
  10. 什么软件硬盘测试修复最好,什么软件检测、修复硬盘坏道最好?
  11. fake_useragent导入无法引用的解决方法
  12. 【电脑技术】修改无线网卡MAC地址失败的原因
  13. 数据库系统概念-第六版 - charter 3 - 笔记
  14. android framework之priv-app,系统特权app权限那些坑
  15. 安装infinity后主页始终显示百度页面?
  16. 【AD】Altium Designer 新建一个项目
  17. 51NOD L4-第三章 树 刷题记录-zgw
  18. va_start 用法
  19. 好诗,有霸气,我喜欢!
  20. 关于网络文学发展形势的三点判断

热门文章

  1. Java---利用程序实现在控制台聊天
  2. Haproxy+Percona-XtraDB-Cluster 集群
  3. 《Windows PowerShell实战指南(第2版)》——1.4 搭建自己的实验环境
  4. iOS开发网络篇—Reachability检测网络状态
  5. 感谢大家对我微软TECHED2013课程的支持
  6. Ken Thompson爷爷的经典复制自身代码程序 - Python版本(只用两行!)
  7. shell中sed -i特殊字符
  8. r语言做断轴_R语言用nls做非线性回归以及函数模型的参数估计
  9. 进制转换中dbho是什么意思_什么是网段?二进制十进制如何互相转换?看完这篇,你就全明白了...
  10. python爬虫常见反爬措施_爬虫常见的反爬措施有哪些