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中的数据结构很多,关联很复杂。在后面的分析中我们再一步步展开。