日期:2014-05-16  浏览次数:20653 次

linux----VFS中的数据结构

虚拟文件系统所隐含的主要思想在于引入了一个通用的文件模型,这个模型能够表示所有支持的文件系统。该模型严格遵守传统Unix文件系统提供的文件模型。

你可以把通用文件模型看作是面向对象的,在这里,对象是一个软件结构,其中既定义了数据结构也定义了其上的操作方法。出于效率的考虑,Linux的编码并未采用面向对象的程序设计语言(比如C++)。因此对象作为数据结构来实现:数据结构中指向函数的域就对应于对象的方法。

 

通用文件模型由下列对象类型组成:

·      超级块(superblock)对象: 存放系统中已安装文件系统的有关信息。对于基于磁盘的文件系统,这类对象通常对应于存放在磁盘上的文件系统控制块,也就是说,每个文件系统都有一个超级块对象.

超级块

很多具体文件系统中都有超级块结构,超级块是这些文件系统中最重要的数据结构,它是来描述整个文件系统信息的,可以说是一个全局的数据结构。Minix、Ext2等有超级块,VFS也有超级块,为了避免与后面介绍的Ext2超级块发生混淆,这里用VFS超级块来表示。VFS超级块是各种具体文件系统在安装时建立的,并在这些文件系统卸载时自动删除,可见,VFS超级块确实只存在于内存中,同时提到VFS超级块也应该说成是哪个具体文件系统的VFS超级块。VFS超级块在inculde/fs/fs.h中定义,即数据结构super_block,该结构及其主要域的含义如下:

 

struct super_block

/************描述具体文件系统的整体信息的域*****************   

       kdev_t s_dev;                /* 包含该具体文件系统的块设备标识符。

例如,对于 /dev/hda1,其设备标识符为 0x301*/

   unsigned long s_blocksize;        /*该具体文件系统中数据块的大小,

以字节为单位 */                                                                       

   unsigned char s_blocksize_bits;   /*块大小的值占用的位数,例如,

如果块大小为1024字节,则该值为10*/  

       unsigned long long      s_maxbytes;     /* 文件的最大长度 */

   unsigned long s_flags;           /* 安装标志*/

   unsigned long s_magic;           /*魔数,即该具体文件系统区别于其它

    文系统的一个标志*/ 

 

/**************用于管理超级块的域******************/

    struct list_head   s_list;   /*指向超级块链表的指针*/  

struct semaphore     s_lock      /*锁标志位,若置该位,则其它进程