`
tomhibolu
  • 浏览: 1384677 次
文章分类
社区版块
存档分类
最新评论

虚拟文件系统之VFS的数据结构(上)

 
阅读更多

努力成为linux kernel hacker的人李万鹏原创作品,为梦而战。转载请标明出处

http://blog.csdn.net/woshixingaaa/archive/2011/05/14/6420098.aspx

VFS所隐含的主要思想在于引入了一个通用的文件模型(common file model),这个模型能够表示所有支持的文件系统。Linux希望以最小的额外开销运行他的本地文件系统。不过,要实现每个具体的文件系统,必须将其物理组织结构转换为虚拟文件系统的通用模型。例如:在通用文件模型中,每个目录被看作一个文件,可以包含若干子目录和其他文件。但是,存在几个非Unix的基于磁盘的文件系统,他们利用文件分配表(File Allocation Table,FAT)存放每个文件在目录树中的位置,在这些文件系统中,存放的是目录而不是文件。为了符合VFS的通用文件模型,对上述基于FAT的文件系统的实现,Linux必须在必要时能够快速建立对应于目录的文件。这样的文件只作为内核内存的对象而存在。通用文件模型由下列对象类型组成:

  • 超级块对象(superblock object)
  • 索引节点对象(inode object)
  • 文件对象(file object)
  • 目录项对象(dentry object)

超级块对象(superblock object):

    存放已安装文件系统的有关信息。对于基于磁盘的文件系统,这类对象通常对应于存放在磁盘上的文件系统控制块(filesystem control block)

    superblock存在于两个链表中,一个是系统所有superblock的链表,一个是对于特定的文件系统的链表。对于系统所有superblock的链表,链表中的第一个元素用super_blocks变量来表示,而超级块对象的s_list字段存放指向链表相邻元素的指针。sb_lock自旋锁保护链表免受多处理器系统上的同时访问;对于特定的文件系统的链表,file_system_typefs_supers字段表示给定类型的已安装文件系统所对应的超级块链表的头。链表元素的向后和向前链接存放在超级块对象的s_instances字段中。

    s_fs_info字段指向属于具体文件系统的超级块信息,比如Ext2文件系统,该字段就指向ext2_sb_info数据结构,该结构包括磁盘分配位掩码和其他与VFS的通用文件模型无关的数据。通常为了效率,由s_fs_info字段所指向的数据被复制到内存。任何基于磁盘的文件系统都需要访问和更改自己的磁盘分配位图,以遍分配和释放磁盘块。VFS允许这些文件系统直接对内存超级块的s_fs_info字段进行操作,而无需访问磁盘。但是,这种方法带来一个新的问题:有可能VFS超级块最终不再与磁盘上相应的超级块同步。因此有必要引入一个s_dirt标志来表示该超级块是否是脏的——那磁盘上的数据是否需要更新。缺乏同步还会导致我们熟悉的一个问题:当一台机器的电源突然断开而用户来不及正常关闭系统时,就会出现文件系统崩溃。

    索引节点对象(inode object):

    存放关于具体文件的一般信息。对基于磁盘的文件系统,这类对象通常对应于存放在磁盘上的文件控制块(file control block)。每个索引节点对象都有一个索引节点号,这个节点号唯一地标识文件系统中的文件。文件系统处理文件所需要的所有信息都放在一个名为索引节点的数据结构中。文件名可以随时更改,但是索引节点对文件是唯一的,并且随文件的存在而存在。内存中的索引节点对象由一个inode数据结构组成。

    inode存在于两个循环双向链表和一个散列表中。一个双向循环链表是inode所在文件系统的super blocks_inodes链表中。链表的头部存放在超级块对象的s_inodes字段中;索引节点对象的i_sb_list字段存放了指向链表相邻元素的指针。另一个循环链表是根据inode的使用状态处于以下3个链表中的某一个:

    1. 有效未使用的索引节点链表
    2. 正在使用的索引节点链表

    3. 脏索引节点链表

    现在来看这3个链表:

    1.有效未使用的索引节点链表,典型的如那些镜像有效的磁盘索引节点,且当前未被任何进程使用。这些节点不为脏,且它们的i_count字段置为0。链表中的首元素和尾元素是由变量inode_unusednext字段和prev字段分别指向的。这个链表用作磁盘高速缓存。

    2.正在使用的索引节点链表,也就是那些镜像有效的磁盘索引节点,且当前被某些进程使用。这些索引节点不为脏,但他们的i_count字段为正数。链表中的首元素和尾元素是由变量inode_in_use引用的。

    3.脏索引节点的链表。链表中的首元素和尾元素是由相应超级块对象的s_dirty字段引用的。这些链表都是通过适当的索引节点对象的i_list字段链接在一起的。

    最后,索引节点对象也存放在一个称为inode_hashtable的散列表中。散列表加快了对索引节点对象的搜索,前提是系统内核要知道索引节点号及文件所在文件系统对应的超级块对象的地址。由于散列技术可能引发冲突,所以索引节点对象包含一个i_hash字段,该字段包含向前和向后两个指针,分别指向散列到同一地址的前一个索引节点和后一个索引节点;该字段因此创建了由这些索引节点组成的双向链表。

    分享到:
    评论

    相关推荐

      linux文件系统-VFS数据结构

      linux文件系统中的虚拟文件系统的数据结构,自己总结的,希望对大家有所帮助。

      linux 虚拟文件系统数据结构关系

      linux 虚拟文件系统的几个数据结构的关系,自己画的

      疯狂内核之——虚拟文件系统

      1 虚拟文件系统概述 5 1.1 通用文件模型 7 1.2 VFS所处理的系统调用 9 2 虚拟文件系统架构 11 2.1 VFS对象数据结构 11 2.1.1 超级块对象 11 2.1.2 索引节点对象 15 2.1.3 文件对象 18 2.1.4 目录项对象 22 2.2 把...

      第17章 虚拟文件系统1

      背景知识– 虚拟文件系统概念虚拟文件系统概念VFS的组成的组成(数据结构数据结构)modutils软件包软件包modutils软件包软件包• 实验内容实验内容•

      Linux文件管理Linux的文件系统

      Linux系统采用虚拟文件系统技术(VFS)、结构采用倒立树型、VFS使Linux支持以下文件系统:  EXT2: 二次扩展  EXT3: 三次扩展  SWAP: 交换文件系统  FAT、FAT32  NTFS (默认不支持,需要特定的模块) ...

      Virtual-File-System:虚拟文件系统为用户提供了与基于UNIX的文件系统相同的所有功能。

      虚拟文件系统虚拟文件系统(VFS)或虚拟文件系统开关是更具体的文件系统之上的抽象层。 VFS的目的是允许客户端应用程序以统一的方式访问不同类型的具体文件系统。 虚拟文件系统向用户提供了与基于UNIX的文件系统相同...

      国内某游戏PAK资源解包代码

      最近在研究虚拟文件系统,VFS,已经能够搞的差不多了,但是有一个数据结构一直搞不定,结构体指针就每月有办法去很好的操作数据,很是无奈。 还是功力不够,需要再练习和学习。下面是国内某游戏的pak文件解压,其实...

      Understanding the Linux Kernel

       虚拟文件系统(VFS)的作用  VFS的数据结构  文件系统类型  文件系统处理  路径名查找  VFS系统调用的实现  文件加锁  第十三章I/O体系结构和设备驱动程序  I/O体系结构  设备驱动程序模型  设备文件  ...

      Linux内核工作原理 word版本 强烈推荐

      同时还描叙了虚拟文件系统(VFS)及Linux核心的每种文件系统是如何得到支持。 网络与Linux几乎是同义的。在某种意义上Linux是WWW时代互连网的产物。其开发者通过Web来交换信息及代码。网络一章描叙了Linux是如何...

      UNIX 高级教程系统技术内幕

      8.9.1 虚拟文件系统转换 8.9.2 mount 的实现 8.9.3 VFS-MOUNT 处理 8.10 对文件的操作 8.10.1 路径名遍历 8.10.2 目录查找缓存 8.10.3 VOP_LOOKUP 操作 8.10.4 打开文件 8.10.5 文件I/O 8.10.6 文件属性 8.10.7 用户...

      Linux编程--Linux内核

      7.2.5 在虚拟文件系统中查找文件 87 7.2.6 卸载文件系统 87 7.2.7 VFS文件系统的inode缓存 87 7.2.8 目录缓存 88 7.3 缓冲区缓存 88 7.3.1 bdflush内核守护进程 90 7.3.2 update进程 90 7.4 /proc文件系统 91 7.5 ...

      LINUX编程白皮书

      7.2.5 在虚拟文件系统中查找文件 87 7.2.6 卸载文件系统 87 7.2.7 VFS文件系统的inode缓存 87 7.2.8 目录缓存 88 7.3 缓冲区缓存 88 7.3.1 bdflush内核守护进程 90 7.3.2 update进程 90 7.4 /proc文件系统 91 7.5 ...

      Linux编程从入门到精通

      2.3 虚拟文件系统系统结构 333 2.3.1 目标 333 2.3.2 模块 333 2.3.3 数据表示 333 2.3.4 数据流、控制流和依赖性 334 2.4 网络接口系统结构 334 2.4.1 目标 334 2.4.2 模块 334 2.4.3 数据表示 335 2.4.4 数据流、...

      Linux编程白皮书

      2.3 虚拟文件系统系统结构 333 2.3.1 目标 333 2.3.2 模块 333 2.3.3 数据表示 333 2.3.4 数据流、控制流和依赖性 334 2.4 网络接口系统结构 334 2.4.1 目标 334 2.4.2 模块 334 2.4.3 数据表示 335 2.4.4 数据流、...

      LINUX编程白皮书 (全集)

      2.3 虚拟文件系统系统结构 333 2.3.1 目标 333 2.3.2 模块 333 2.3.3 数据表示 333 2.3.4 数据流、控制流和依赖性 334 2.4 网络接口系统结构 334 2.4.1 目标 334 2.4.2 模块 334 2.4.3 数据表示 335 2.4.4 数据流、...

      Linux编程资料

      2.3 虚拟文件系统系统结构 333 2.3.1 目标 333 2.3.2 模块 333 2.3.3 数据表示 333 2.3.4 数据流、控制流和依赖性 334 2.4 网络接口系统结构 334 2.4.1 目标 334 2.4.2 模块 334 2.4.3 数据表示 335 2.4.4 数据流、...

      清华大学Linux操作系统原理与应用

      8.2.1 虚拟文件系统的引入 168 8.2.2 VFS中的数据结构 170 8.2.3 VFS超级块数据结构 171 8.2.4 VFS的索引节点 173 8.2.5 目录项对象 174 8.2.6 与进程相关的文件结构 176 8.2.7 主要的数据结构之间的关系 179 8.3 ...

    Global site tag (gtag.js) - Google Analytics