Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1337601
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类:

2011-03-22 21:02:26

文件系统中主要对象:
●超级块(superblock)对象: 存放系统中已安装文件系统的有关信息。对于基于磁盘的文件系

统(具有I/O操作),这类对象通常对应于存放在磁盘上的文件系统控制块(FCB),也就是说,

每个文件系统都有一个超级块对象。
●索引节点(inode)对象: 存放关于具体文件的一般信息。对于基于磁盘的文件系统,这类对

象通常对应于存放在磁盘上的文件控制块(FCB),也就是说,每个文件都有一个索引节点对象。每

个索引节点对象都有一个索引节点号,这个号唯一地标识某个文件系统中的指定文件。
●目录项(dentry)对象: 存放目录项与对应文件进行链接的信息。VFS把每个目录看作一个由

若干子目录和文件组成的常规文件。例如,在查找路径名/tmp/test时 , 内核为根目录“/ ”创

建第一个目录项对象, 为根目录下的 tmp项创建第二级目录项对象,为 /tmp 目录下的test项创

建第三级目录项对象。
●文件(file)对象: 存放打开文件与进程之间进行交互的有关信息。这类信息仅当进程访问文件

期间存在于内存中。
超级块用来描述整个文件系统的信息
每个文件除了有一个索引节点inode数据结构外,还有一个目录项dentry数据结构。dentry 结构

中有个d_inode指针指向相应的inode结构。
dentry结构代表的是逻辑意义上的文件,所描述的是文件逻辑上的属性,因此,目录项对象在磁

盘上并没有对应的映像;而inode结构代表的是物理意义上的文件,记录的是物理上的属性
一个索引节点对象可能对应多个目录项对象
一个有效的dentry结构必定有一个inode结构,这是因为一个目录项要么代表着一个文件,要么

代表着一个目录,而目录实际上也是文件。所以,只要dentry结构是有效的,则其指针d_inode

必定指向一个inode结构。可是,反过来则不然,一个inode却可能对应着不止一个dentry结构;

也就是说,一个文件可以有不止一个文件名或路径名。这是因为一个已经建立的文件可以被链接

(link)到其他文件名。所以在inode结构中有一个队列i_dentry,凡是代表着同一个文件的所有

目录项都通过其dentry结构中的d_alias域挂入相应inode结构中的i_dentry队列。

主要数据结构之间的关系

超级块是对一个文件系统的描述;索引节点是对一个文件物理属性的描述;而目录项是对一个文

件逻辑属性的描述。
当内核被编译时,就已经确定了可以支持哪些文件系统,这些文件系统在系统引导时,在VFS中

进行注册。如果文件系统是作为内核可装载的模块,则在模块安装时进行注册,并在模块卸载时

注销。
每个文件系统都有一个初始化例程,它的作用就是在VFS中进行注册,即填写一个叫做

file_system_type的数据结构,该结构包含了文件系统的名称以及一个指向对应VFS超级块读取

例程的地址。所有已注册的文件系统的file_system_type结构形成一个链表,称为注册链表。要

对一个文件系统进行注册,就调用register_filesystem()函数。

编写一个新的文件系统涉及的基本对象——一个结构、四个操作表
文件系统类型结构(file_system_type)
超级块操作表(super_operations)
索引节点操作表(inode_operations)
页缓冲区操作表(address_space_operations)(虚拟文件系统可以不要)
文件操作表(file_operations)

做自己的文件基本系统步骤:
首先,建立一个文件系统类型(file_system_type)来描述文件系统,它包含文件系统的名称、

类型标志以及get_sb()等操作。当安装文件系统时,系统会对该文件系统进行注册,即填充

file_system_type结构,然后调用get_sb()函数来建立该文件系统的超级块。
接下来,创建超级块操作表(super_operations),提供创建一个索引节点、释放一个索引节点

等的相关函数。
然后,索引节点操作表(inode_operations),提供索引节点的一些自操作函数,如lookup()用

于搜索索引节点,建立符号连接等

    有关目录项对象的理解一直让我很迷惑,心里总以为目录项对象只是目录而已,看完以下的文章你将会有写明白吧,前提是你已经看过这方面的内容了,只是和我一样遇到了疑问。

目录项对象

      每个文件除了有一个索引节点inode数据结构外,还有一个目录项dentry(directory enrty)数据结构。dentry 结构中有个d_inode指针指向相应的inode结构。读者也许会问,既然inode结构和dentry结构都是对文件各方面属性的描述,那为什么不把这两个结构“合而为一”呢?这是因为二者所描述的目标不同,dentry结构代表的是逻辑意义上的文件,所描述的是文件逻辑上的属性,(注释:从用户观点看逻辑文件是用户所观察到的文件组织形式,是用户可以直接处理的数据及结构,它独立于物理设备,逻辑文件又称为文件组织。物理文件是与存储介质性能有关的,在外存上存储的组织形式。 )因此,目录项对象在磁盘上并没有对应的映像;而inode结构代表的是物理意义上的文件,记录的是物理上的属性,对于一个具体的文件系统(如Ext2),Ext2_ inode结构在磁盘上就有对应的映像。所以说,一个索引节点对象可能对应多个目录项对象。

    dentry 的定义在include/linux/dcache.h中:

    struct dentry {

       atomic_t d_count;        /* 目录项引用计数器 */

       unsigned int d_flags;    /* 目录项标志 */

       struct inode  * d_inode;   /* 与文件名关联的索引节点 */

       struct dentry * d_parent;       /* 父目录的目录项 */

       struct list_head d_hash;        /* 目录项形成的哈希表 */

       struct list_head d_lru;         /*未使用的 LRU 链表 */

      struct list_head d_child;       /*父目录的子目录项所形成的链表 */

     struct list_head d_subdirs;     /* 该目录项的子目录所形成的链表*/

     struct list_head d_alias;       /* 索引节点别名的链表*/

     int d_mounted;                  /* 目录项的安装点 */

     struct qstr d_name;             /* 目录项名(可快速查找) */

     unsigned long d_time;           /* 由 d_revalidate函数使用 */

     struct dentry_operations  *d_op; /* 目录项的函数集*/

     struct super_block * d_sb;      /* 目录项树的根 (即文件的超级块)*/

     unsigned long d_vfs_flags;  

     void * d_fsdata;                /* 具体文件系统的数据 */

     unsigned char d_iname[DNAME_INLINE_LEN]; /* 短文件名 */

};

下面对dentry结构给出进一步的解释。

一个有效的dentry结构必定有一个inode结构,这是因为一个目录项要么代表着一个文件,要么代表着一个目录,而目录实际上也是文件。所以,只要dentry结构是有效的,则其指针d_inode必定指向一个inode结构。可是,反过来则不然,一个inode却可能对应着不止一个dentry结构;也就是说,一个文件可以有不止一个文件名或路径名。这是因为一个已经建立的文件可以被连接(link)到其他文件名。所以在inode结构中有一个队列i_dentry,凡是代表着同一个文件的所有目录项都通过其dentry结构中的d_alias域挂入相应inode结构中的i_dentry队列。

    在内核中有一个哈希表dentry_hashtable ,是一个list_head的指针数组。一旦在内存中建立起一个目录节点的dentry 结构,该dentry结构就通过其d_hash域链入哈希表中的某个队列中。

   内核中还有一个队列dentry_unused,凡是已经没有用户(count域为0)使用的dentry结构就通过其d_lru域挂入这个队列。

   Dentry结构中除了d_alias 、d_hash、d_lru三个队列外,还有d_vfsmnt、d_child及d_subdir三个队列。其中d_vfsmnt仅在该dentry为一个安装点时才使用。另外,当该目录节点有父目录时,则其dentry结构就通过d_child挂入其父节点的d_subdirs队列中,同时又通过指针d_parent指向其父目录的dentry结构,而它自己各个子目录的dentry结构则挂在其d_subdirs域指向的队列中。

     从上面的叙述可以看出,一个文件系统中所有目录项结构或组织为一个哈希表,或组织为一颗树,或按照某种需要组织为一个链表,这将为文件访问和文件路径搜索奠定下良好的基础。

阅读(961) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~