[内核摘要] 虚拟文件系统

  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值