本文将描述Linux内核中的VFS(Virtual File System)。对于VFS这个概念其实非常容易理解,无非是一个抽象的统一接口:它定义了所有文件系统都支持的基本的和概念上的接口和数据结构,这样就 在用户上层看来,无论对何种文件系统都拥有统一的接口,和操作方式。其实,对VFS的理解停留在这个层面上对于掌握其思想已经够用了,剩下要讨论的也就是 它的实现和一些和进程和文件系统的外延部分了。

目前总有一些困惑就是对于一个问题或者概念的抽象层次的把握,比如对于一个软件工程师,他需要对计算机有所了解,不过不可能做到样样深入,比如内存,我们 需要知道它是用来存储临时数据的,性能介于寄存器和磁盘之间,我们不需要知道它是如何设计的,经过多少工艺制作而成的。所以有的时候,你对一个问题的抽象 层次决定着你对问题的把握。因为不可能完全把问题从最底层剖析,我们只能在我们所熟知的层面或者说是我们所需要的层面去剖析问题。

话题有些扯远了,不过我想表达的是,如果只是想知道VFS是什么东西的话,第一段的几句话我认为已经够用了。那么继续深入的意义究竟何在呢?或者说目的究竟何在呢?我认为有这么几点吧:

1. 文件系统的内存表示

文件系统一方面定义了如何在磁盘上组织用户的数据信息,那如何高效的读写管理文件就是内核要考虑的事情了。VFS就是linux用来管理文件系统的方式(当然不仅仅是vfs,还牵涉到I/O等等方面)。

2. VFS设计

VFS是一个比较成功的例子,它为所有的文件系统提供统一的接口,这个思想和设计可以被借鉴到其他地方。另外VFS用到的面向对象的概念,所以这又是一个c语言实现的面向对象范例。

3. 算法

对dcache中用到LRU. slab存储dentry

好了,有了目标,那接下来就是各取所需了。

文件系统的内存表示

这个标题有点起大了,更贴切的应该说是vfs中的一些数据结构。

首先来说一下Linux中用到的和文件系统相关的传统抽象概念:文件,目录项,i-node,mount point

这里我想从i-node说起,因为i-node本身的概念使得文件和目录项并不是我们通常说想象的那样了。i-node是*nux文件系统中用来表示文件和目录的数据结构。也就是说通过i-node我们可以知道文件的所有信息。具体的描述可以参考另一篇文章:Ext3 File system Disk Layout

那么如果i-node已经代表文件和目录,那么这里的文件和目录项又是什么意思呢?

文件对象

我们先说文件对象,这里的文件对象是指打开的文件在内存中的表示。该对象由open()系统调用创建,由close()系统调用销毁。也就是说一个文件系 统中的文件可能存在多个对应的文件对象。它其实是用在进程的角度的,多个进程可以同时打开同一个文件,不过打开的文件会有自己特有的状态信息,比如文件的 偏移量。所有在内存中需要有这个对象记录这些信息。

这个对象是以struct file **fd;形式存储的,如下图所示,一个fd指向一个File Object。

当然File Object又应该指向其对应的i-node,虽然事实上File Object并没有存inode的指针,而是存着dentry的指针(dentry指向i-node)。这里就引出了下一个概念:目录项(dentry)

目录项与目录项缓存

我们既然有了i-node来表示目录,那为什么还需要dentry呢?原因是VFS经常需要执行目录相关的操作,比如路径名查找等。路径名查找需要不断的 解析路径,为了方便起见,就引入了dentry这个概念。目录项没有对应的磁盘数据结构,VFS根据字符串形式的路径名现场创建它。

dentry就是目录的内存表示,比如/tmp/test这个路径,内核为根目录"/”创建一个目录项对象,为tmp创建一个第二级目录项对象,为 test创建第三级目录项对象。这里要说明的是/tmp/test和/home/test中test目录项有什么不同,虽然名字同是test,不过很显然 它们指的是不同的文件,所以它们的i-node不同。另外,在dentry中会记录其父目录的目录项对象d_parent。当然,如果/home /test是链接到/tmp/test文件上,它们就会有相同的i-node,不过它们的父目录的目录项不同,一个是tmp,而另一个是home。可见, 对目录项的hash就应该是针对当前文件名和父目录的目录项对象。

现在我们来说一下目录项高速缓存:

1. 所有未使用的目录项对象都存放在一个LRU的双向链表中,既然是LRU,那当目录项高速缓存空间减少的时候会从LRU的尾部删除。这个链表头存放在dentry_unsued变量中,链表由每个dentry的d_lru变量链接。

2. 在使用的目录项对象是被相应的i-node节点的i_dentry变量所指向,i_dentry同样是一个list头指针,这里用list的原因是每个 i-node节点可能与若干硬连接关联。而目录项对象的d_alias变量存放这个链接表的相邻元素。当在使用的目录项对象被删除时就会被移动到上面所说 的未使用目录项的LRU中。

3. 散列表dentry_hashtable是一个链表的数组,其作用是用来快速定位dentry的,其hash函数是由目录项的parent指针和文件名决定的。

这里顺便提一下,dentry对象是存储在kernel的slab分配器高速缓存中的,是在Dcahce.c中的dentry_cache。slab高速缓存是内存对象管理的一种算法,这个已经超出了本文的范围。

Mount Point

//TODO:

路径名查找

//TODO:

以上引用来自http://blog.sina.com.cn/s/blog_55465b4701017qoz.html

转载于:https://www.cnblogs.com/pxguoo/archive/2013/04/07/3003977.html

linux的虚拟文件系统VFS相关推荐

  1. linux 内核 虚拟文件系统VFS 路径查找 path_lookup

    路径查找是VFS的一个主要操作:给定一个文件名,获取该文件名的inode.路径查找是VFS中相当繁琐的一部分,主要是符号链接,文件系统装载点,以及. ..和//等奇怪路径 引入了复杂性. nameid ...

  2. linux 文件系统 vfs,linux虚拟文件系统vfs

    <操作系统>课程设计报告课程设计题目:操作系统课程设计 设计时间:2016/1/10一. 课程设计目的与要求需要完成的内容:(1) 安装虚拟机:Vmware.Vmware palyer ( ...

  3. Linux虚拟文件系统VFS的相关数据结构和操作

    最近看到几篇介绍VFS的韩语文章,觉得里面的众多绘图清晰易懂,冒昧将其摘选出来,分享给大家,希望大家可以从更多的角度去理解和认识VFS的构成和原理.原文地址位于 https://m.blog.nave ...

  4. Linux文件系统概述:硬盘驱动>通用块设备层>文件系统>虚拟文件系统(VFS)

    目录 一.概述 1. 硬盘驱动 2. 通用块设备层 General Block Device Layer 3. 文件系统 4. 虚拟文件系统(VFS) 二.存储介质 闪存(Flash Memory) ...

  5. Linux 文件系统原理 / 虚拟文件系统VFS

    Linux 文件系统原理 / 虚拟文件系统VFS 虚拟文件系统 VFS VFS 定义 VFS 的对象演绎 超级块 super_block 索引节点 inode 目录项 dentry 文件 file 文 ...

  6. Linux虚拟文件系统vfs及proc详解

    /proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用.可以使用的文件随系统配置的变化而变化.命令procinfo能够显示基于其中某些文件的多种系统信 ...

  7. linux内核源码分析之虚拟文件系统VFS(一)

    目录 一.文件系统类型 二.VFS虚拟文件系统 三.VFS中主要的对象类型 四.结构体之间的关系 五.inode 节点 一.文件系统类型 基于磁盘的文件系统:在非易失介质上存储文件,在多次会话间保持文 ...

  8. 虚拟文件系统(VFS)

    原文链接:http://www.orlion.ga/1008/ linux在不同的文件系统之上做了一个抽象层,使得文件.目录.读写访问等概念都成为抽象层概念,这个抽象层被称为虚拟文件系统(VFS). ...

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

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

最新文章

  1. android 内部存储 清空,Android清空应用内部文件缓存
  2. React AntD 表格查看修改时默认选中几行数据
  3. python 核心编程第5章(习题)
  4. 芒果云接吗_芒果糯米饭是生产力的关键吗?
  5. 【Spark Summit East 2017】使用Spark MLlib和Apache Solr构建实时实体类型识别系统
  6. python 循环播放音乐_python gstreamer实现视频快进/快退/循环播放功能
  7. 【学习记录】第一章 数据库设计-《SQL Server数据库设计和开发基础篇视频课程》...
  8. sql server 替换字符串中的某些字符
  9. 高中计算机教学设计案例分析,高一年级信息技术教学设计(案例)
  10. 0712CF解题报告
  11. python 三次样条_python实现三次样条插值
  12. 爬虫---高性能爬虫
  13. 英语句式参考纯享版 - 定语从句
  14. 构建具有时间依存协变量的Elastic-net Cox模型
  15. [机缘参悟-1] - 活在当下,仰望星空,梦在梦里,俯视天下
  16. 亚马逊森林大火----- 我也来评论一下
  17. halcon案例-指纹图片增强
  18. SpringBoot报错Shutting down ExecutorService ‘applicationTaskExecutor‘解决方法
  19. java连缀怎样写_【20200625】连缀例话:-写文章的7项好处
  20. 约翰·卡马克和他的id Software

热门文章

  1. 3.6 matlab函数文件的定义与调用
  2. 在Ubuntu中安装VMD
  3. Remove Duplicates from Sorted ListII
  4. python list循环语句的使用方法
  5. 牛顿法求解方程(python和C++)
  6. Springboot 简单的定时器
  7. jQuery - focusin/focusout/focus/blur事件的区别与不同
  8. 6.4高级查询:分组查询 链接查询 子查询 联合查询
  9. Jmeter创建一个点对点的 JMS 测试计划
  10. hdu 2191 多重背包