《Linux内核设计与实现》——虚拟文件系统

来源:互联网 发布:java周末班 编辑:程序博客网 时间:2024/05/16 05:57

一、通用文件系统接口

  1、虚拟文件系统(VFS)作为内核子系统,为用户空间程序提供了文件和文件系统相关的接口。


  2、VFS使得用户可以直接使用系统调用而无须考虑具体文件系统和实际物理介质。


  3、VFS与块I/O相结合,提供抽象、接口以及交融,使得用户空间的程序调用统一的系统访问各种文件,不管文件系统是什么,也不管文件系统位于何种介质,采用的命名策

        略是 统一的。



二、文件系统抽象层

  1、文件系统抽象层使Linux能够支持各种文件系统,即便是它们在功能和行为上存在很大区别。为了支持多文件系统,VFS提供了一个通用文件系统模型,该模型囊括了任何

         文件系统的常用功能集合行为。


  2、VFS抽象层之所以能支持各种各样的文件系统,是因为它们定义了所有文件系统都支持的,基本的,概念上的接口和数据接口,同时实际文件系统也将自身的一些概念在形式上与VFS的定义保持一致。



三、UNIX文件系统

  1、UNIX使用了四种和文件系统相关的传统抽象概念:文件、目录项、索引节点和安装点。从本质上讲文件系统是特殊的数据分层存储结构,它包含文件、目录和相关的控制

        信息。


  2、文件其实可以作一个有序字节串,字节串中第一个字节是文件的头,最后一个字节是文件的尾。每一个文件文件巍峨便于系统和用户识别,都被分配一个便于理解的名字。


  3、文件通过目录组织起来。目录也可以包含其他目录,即子目录,所以目录可以层层嵌套,形成文件路径。路径中的每一部分都被称作目录条目。所有的目录条目统称目录

        项。


  4、文件的相关信息,有时被称作文件的元数据,被存储在一个单独的数据结构中,该结构被称为索引节点。



四、VFS对象及其数据结构               

  1、VFS中有四种主要的对象类型,它们分别是:

    1)、超级块对象,它代表一个具体的已安装文件系统。

    2)、索引节点对象,它代表一个具体文件。

    3)、目录项对象,它代表一个目录项,是路径的一个组成部分。

    4)、文件对象,它代表由进程打开的文件。


  2、VFS中的每个主要对象,这些操作对象描述了内核针对主要对象可以使用的方法:

    1)、super_operrations对象,其中包括内核针对特定文件所能调用的方法。

    2)、inode_operations对象,其中包括内核针对特定文件夹所能调用的方法。

    3)、dentry_operations对象,其包括内核针对特定目录所能调用的方法。

    4)、file_operations对象,其中包括进程针对已打开文件所能调用的方法。


  3、操作对象作为一个结构指针来实现,此结构中包含指向操作其父·对象的函数指针。



五、超级块对象

  1、各种文件系统都必须实现超级块对象,该对象用于存储特定文件系统的信息,通常对应存放在磁盘特定扇区中的文件系统超级块或文件系统控制块。


  2、超级块对象由super_block结构表示,定义在文件<linux/fs.h>中。

 

  3、创建、管理和撤销超级块对象的代码位于文件fs/super.c中。超级块对象通过alloc_super()函数创建并初始化。



六、超级块操作

  1、超级块对象中最重要的一个域是s_op,它指向超级块的操作函数表。超级块函数表由super_operations结构体表示,定义在文件<linux/fs.h>。

   

  2、该结构体每一项都是一个指向超级块操作函数的指针,超级块操作函数执行文件系统和索引节点的底层操作。当文件系统需要对其超级块执行操作时,首先要做的就是在超

        级块对象中寻找需要操作的方法。


  3、super_oprations中,超级块操作函数的用法。(P216-P217)



七、索引节点对象

  1、索引节点对象包含了内核在操作文件和目录时需要的全部信息。


  2、索引节点对象由inode结构体表示,它定义在文件<linux/fs.h>中。


  3、一个索引点代表文件系统中的一个文件,它可以是设备或管道这样的特殊文件。



八、索引节点操作

  1、索引节点对象inode_operations描述了VFS用以操作索引节点对象的所有方法,这些方法由文件系统实现。

      

  2、inode_oprations中,索引节点操作函数的用法。(P219-P222)



九、目录对象

 一)、相关简介

  1、VFS把目录当作文件对待。为了方便查找操作,VFS引入了目录项的概念。

    1)、必须明确一点:在路径中(包括普通文件在内),每一部分都是目录项对象。

    2)、目录项也可包括安装点。


  2、目录项由dentry结构体表示,定义在文件<linux/dcache.h>中。



 二)、目录项状态

  1、目录项对象有三种有效状态:被使用、未被使用和负状态。


  2、一个被使用的目录项对应一个有效的索引节点(即d_inode指向相应的索引节点)并且表明该对象存在一个或多个使用者(即d_count为正值)。一个目录项处于被使用状

        态,意味着它正被VFS使用并且指向有效的数据,因此不能被丢弃。


  3、一个未被使用的目录项对应一个有效的索引节点(d_inode指向一个索引节点),但是应指明VFS当前并未使用它(即d_count为0)。该目录项对象仍然指向一个有效对

        象,而且被保留在缓存中以便需要时在使用它。


  4、一个负状态的目录项没有对应的有效索引节点(d_inode为NULL),因为索引节点已被删除,或路径不再正确。但是目录项仍然保留,以便快速解析以后的路径查询。



 三)、目录项缓存

  1、目录项缓存包括三个主要部分

    1)、“被使用的”目录项缓存表。

    2)、“最近被使用的”双向链表。

    3)、散列表和相应的散列函数用来快速地给定路径解析为相关目录项对象。


  2、散列表由数组dentry_hashtable表示,其中每一个元素都是一个指向具有相同键值的目录项对象的指针。数组大小取决于系统中物理内存大小。


  3、实际的散列值由d_hash()函数计算,踏实内核提供给文件系统的惟一的一个散列表。


  4、查找散列表要通过d_lookup()函数,如果该内核在dcache中发现与其相匹配的目录项对象,则匹配的对象被返回;否则,返回NULL指针。


  5、dcache在一定的意义上也提供对索引节点的缓存,也就是icache。



十、目录项操作

  1、dentry_operations结构体指明了VFS操作目录项的所有方法该结构定义在文件<linux/dcache.h>中。


  2、函数的具体用法(P224-P225)



十一、文件对象

  1、文件对象是已打开的文件在内存中的表示。该对象由相应的open()系统调用创建,由close()系统调用撤销,所有的这些文件相关的调用实际上都是文件操作表中定义的方

        法。


  2、文件对象由file结构体表示,定义在文件<linux/fs.h>中。



十二、文件操作

  1、文件对象的操作由file_operations结构体表示,定义在文件<linux/fs.h>中。


  2、文件操作函数(P227-P230)。



十三、和文件系统相关的数据结构

  1、file_system_type结构体用来描述各种特定文件系统描述类型。此被定义在<linux/fs.h>中。


  2、vfsmount用来描述一个安装文件系统的实例。此被定义在<linux/mount.h>中。



十四、和进程相关的数据结构

  1、有三个数据结构将VFS层和系统的进程紧密联系在一起,它们分别是:file_struct、fs_struct和namespace。


  2、file_struct结构体定义在文件<linux/fdtable.h>中。该结构体由进程描述符中的files目录项指向。所有与单个进程县相关的信息都包含在其中。


  3、fs_struct结构体由进程描述符的fs指向。它包含文件系统和进程相关信息,定义在文件<linux/fs_struct.h>中。


  4、namespace结构体定义在<linux/mmt)namespace.h>中,由进程描述符中的mmt_namespace域指向。

0 0