linux的VFS

前言

学习自用,有错麻烦提一下

正文

有不同的文件系统,比如ex2,ext3,FAT,NTFS,而对于程序来说,这些文件系统的使用都是差不多的,有着相同的API,平时几乎感受不到差别,而这几个文件系统的implementation实际是千差万别的,linux是通过一层抽象来实现的而这层抽象实际上是VFS, virtual file system或者virtual filesystem switch

VFS层有四个重要的数据结构,Inode,superblock,file和dentry;

Inode

unix,一切皆为文件,而每个文件需要有数据结构来封装它的信息,在linux中文件数据和文件信息是完全分开的,文件信息全部被存在于inode中,每个inode对应磁盘上相应的文件,注意文件夹也是种文件,这就是inode的作用;inode是在文件打开后才被创建的

详细重要结构:

对于Inode对象,有hard_link的计数,同步用的semaphore和spinlock,地址,last_access_time,inode的operation有symbolic link的创建,mkdir和rmdir操作等

superblock

是针对于文件系统的数据结构,它存有被挂在的文件系统的特定信息,也难怪在ext2文件系统里,要把superblock存在每个block的开头以防止磁盘crash而崩溃

详细重要结构:

superblock里会有inode的链表,同步的信号量semaphore,根节点的dentry,对于operation还包括添加删除某个inode,

dentry

全名是directory entry,有别于inode,是目录相关的数据结构,用来联系起文件夹关系,一个dentry代表一个目录结构中的一部分,如/home/root/中,会产生home和root和 "/ "三个结构

dentry的结构里含有成员:相关inode,同步用的spinlock,子目录和父目录的dentry;dentry在slab中也有一席之地,就像inode一样,因为它经常被删除创建;而且dentry会有特定的cache,即dcache,用来加快访问,dcache有三部分,按使用时间排序的链表,hash table和;inode链表;其中hash table用来把目录路径快速转成dentry,

file

file 对象,存储了进程与打开的文件的信息,与进程息息相关,包含进程当前运行目录等

一个进程通过打开file object,file object在dentry 里找到inode object,从而才和disk联系上的

file对象成员包含:所在目录,spinlock,原子的count,它和dentry一样只是内存的对象,不会被存到磁盘上,也容易知道它的操作,有read,write,open,flush等,还有poll操作,

 

其他的数据结构

如描述挂载点,即描述一个文件系统实例的vfsmount结构,其中包含内容如位置,

operation成员

对于上面的四种主要对象,会包含相应的operation对象,用来告诉用户或者内核可用操作,比如对于file的operation有read和write,对于inode的link(),在这个对象里会把每个filesystem的实现细节隐藏起来,

 

VFS中的进程相关结构

是用来描述被进程和文件关系的,,,区别开于file object

再说一下一个数据结构是与进程相关的,有三种结构,一种是files_struct结构,包含成员:spinlock,打开的文件描述符列表等,一种是fs_struct,用来包含文件系统信息,包含读写锁,root和当前目录等成员,第三种是namespace成员,包含root的vfsmount结构,挂载点链表,polling waitqueue,

进程和以上结构的关系

linux的VFS

参考资料

  1. [图的来源](https://blog.csdn.net/qq_34992845/article/details/71446333)
  2. linux kernel development
  3. understanding linux kernel