linux文件系统的系统分析--(一)vfs和数据结构

来源:互联网 发布:php环境一键安装包 编辑:程序博客网 时间:2024/05/17 12:49


 Linux的虚拟文件系统层的特点在于把很多不同种类文件系统的共同信息放入内核;可以通过vfs的转换来利用linux所支持挂载的实际文件系统。实际上,因为有了vfs,也可以较为方便的按照vfs的一些接口将文件系统移植过来,比如win下的ntfs和fat32就是如此。在open read等系统调用之后就是到vfs_read 等式样的函数,在vfs层做些处理后,再根据当前操作的路径所挂载在哪个文件系统下,再转换为相应文件系统的read等操作。所以从这一点上来说:vfs称为虚拟文件系统转换(virtual filesystem switch)更恰当。

     vfs所支持的文件系统主要分为3类:

     1、磁盘文件系统:比如ext2、ntfs。以前分析过的omfs也属于这类,当时看这个omfs介绍,好像用在日本一家公司的mp3中。

     2、网络文件系统:比如nfs。平常肯定会用到的,太方便了。

     3、特殊文件系统。比如sysfs和proc。sysfs是专门为设备管理写的文件系统,而proc文件系统可以监控内核或部分操作改变某些内核功能或状态。

     当然这些文件系统都是挂载在根文件系统之下的(rootfs),rootfs是如何加载的,“/”是如何建立的?这个是个重点。

     在分析“/”之前,需要对下面四个最基本的数据结构做了说明:

     这四个对象都是存在与内存中的,但是在创建这些对象的时候,有些对象的部分值是从物理介质中获取的。

     超级块对象(superblock object)

             存放已安装文件系统的有关信息。对于基于磁盘的文件系统,这类对象通常存在于物理介质的最开头部分:文件系统控制块(filesystem control block)。

     索引节点对象(inode object)

             存放关于具体文件的一般信息。对基于磁盘的文件系统,这类对象通常对应于存放在磁盘上的文件控制块。每个索引节点对象都有一个索引节点号,这个节点号唯一的标识      文件系统中的文件。比如在omfs文件系统中,就有omfs_inode结构体。会从物理介质中读取信息填充omfs_inode,然后再创建inode对象。

     文件对象(file object)

              存放打开文件与进程之间进行交互的有关信息。这类信息仅存放于内核内存中。

      目录项对象(dentry object)

                存放目录项与对应文件进行链接的有关信息。每个磁盘文件系统都以自己特有的方式将该类信息存在磁盘上。比如omfs文件系统,在介质最开始存放的是super block         的一些信息,然后是一个bitmap,用来标识哪些空间是空闲的,哪些空间被占用了;然后就是存目录项的位置,最后绝大部分空间就是存具体文件。当然,每个文件系统以        自己特有的方式来存,比如omfs就用hash,btrfs就用btree。

       

      与上面几个对象相关的数据结构:

            与superblock相关的方法就是struct super_operations *s_op

            这个结构体中包括删除文件或安装磁盘等操作,也包括分配撤销索引节点,读写索引节点等操作。

            与inode 相关的方法就是struct inode_operations *i_op

             这个结构体中包括create、symlink、mkdir、rmdir、mknod等与索引节点相关的操作。

            与file 相关的方法就是struct file_operations *f_op

            这个结构体我们最熟悉了,因为做设备驱动,很多工作就是构造这个结构体中的方法:read write llseek poll open poll等操作。           

            与dentry相关的方法就是struct dentry_operations *d_op

     

     vfs相关的数据结构结构先介绍到这里,vfs中的数据结构很多,关联很复杂。在后面的分析中我们再一步步展开。


转自http://blog.csdn.net/dndxhej/article/details/7422237

阅读全文
1 0