VFS各对象间的联系

1. VFS主要数据结构间的联系

前面我在其他博客文章中已经整理了VFS主要数据结构的说明,这里主要是以一个例子将它们联系起来。假设/home目录下有一个用户名为book,在book目录下有两个文件,文件b是文件a的硬链接,同一时刻有三个进程在读取文件,其中有两个进程访问了同一文件a,另外一个进程访问了文件b,图示如下:
在这里插入图片描述

  • 文件描述符 task_struct 中的 files 字段中的 fd 指向该进程已打开文件的指针数组,其中前三个索引指向的文件对象默认被占用,所以用户打开的文件从索引3开始分配。每个进程打开文件时都会分配一个文件对象。
  • 文件对象中的 f_dentry 字段指向打开文件的目录项,由于进程1,2打开的是同一个文件a,所以它们指向同一个 dentry 对象,进程3打开的是文件b,所以指向另外一个 dentry 对象。
  • 由于b是a的硬链接,所以它们的 d_inode 字段指向了同一个 inode 对象。其他的目录项对象也都有一个有效的 inode与其对应。
  • 根据路径/home/a和/home/b,解析分量,目录项对象中的 d_parent 字段指向父目录。
  • 如果当前目录中拥有子目录或文件,则子目录项会添加到双向链表中, d_subdirs 字段为链表的头,d_child 字段指向相邻元素。
  • 每个目录项都对应一个索引节点对象,但由于硬链接的存在,索引节点可能对应多个目录项,所以需要一个双向链表,索引节点对象中的 i_dentry 为该链表的头,目录项对象的 d_alias 字段指向相邻元素。
  • 当内核将一个索引节点从磁盘装入内存时,就会把指向这些文件操作的指针放在file_operations 结构体中,该结构体地址放在该索引节点对象的 i_fop 字段中。当进程打开这个文件时,VFS就用存放在索引节点中的这个地址初始化新文件对象的 f_op 字段。
  • 虽然路径中的每个分量都被解析为一个目录项,但我们还是把最后一个分量文件看作一个特殊的目录项。目录和文件同样都有关联的索引节点对象,但其 i_op 和 i_fop 使用的操作集合还是会有差别,已Ext2为例,两者文件操作集合分别为 ext2_file_operations 和 ext2_dir_operations,而索引节点的操作集合分别为:ext2_file_inode_operations 和 ext2_dir_inode_operations。
  • 在同一个文件系统中,所有的目录项对象和索引节点对象中指向超级块的字段都指向同一个超级块对象地址。
  • 超级块对象的 s_inodes 字段是所有索引节点链表的头,索引节点对象中的 i_sb_list 字段指向链表中相邻元素。
  • 超级块对象的 s_files 字段是所有文件对象链表的头,文件对象的 fu_list 字段指向链表相邻元素。

2. 发生普通安装时数据结构间的联系

当发生普通挂载时(一个文件系统将被安装在一个已安装文件系统之上),以下面的例子表示各对象间的联系。假设实际的根文件系统类型为Ext2,一个进程打开/usr/b文件,接下来以tmp目录作为挂载点,挂载和根文件系统相同的Ext2类型的文件系统,另一个进程打开/tmp/b文件。图示如下,为了简化图示,上图中表达过的数据关系这里不再表示:

在这里插入图片描述

  • 进程间共享同一命名空间,root 字段表示已安装文件系统树的根。list 字段是命名空间内所有已安装文件系统描述符双向链表的头,已安装文件系统描述符的 mnt_list字段指向相邻元素。
  • 默认情况下进程的根目录与系统的根文件系统的根目录一致,所以 fs_struct 结构中的 root 字段指向根目录。rootmnt 字段指向根文件系统的已安装文件系统描述符。
  • 已打开文件对象的 f_vfsmnt 字段指向其对应的已安装文件系统描述符。
  • 注意红色虚线框内左边的目录项表示的是新安装文件系统的根目录项,对应已安装文件系统描述符的 mnt_root 字段(这个根目录项名字也取为“/”,但是在访问路径的时候除了绝对路径中的“/”和正常分隔符以外,这个“/”不会出现在路径中,应该使用挂载点的名字,例如访问a文件:/tmp/a 而不是 /tmp//)。而框内右边的是挂载点的目录项对象,对应的是 mnt_mountpoint 字段。
  • 新挂载文件系统(之前没有挂载过),会重新分配一个超级块对象,相应的目录项,索引节点和已安装文件系统描述符的超级块字段会指向这个超级块。如果同一个文件系统再次挂载到其他目录,则可以通过不同的挂载点访问到文件系统根目录,而超级块只有一个。
  • 挂载点目录项的 d_mounted 字段计数会递增,程序中通过此字段可以简单判断该目录是否挂载了文件系统。
  • 同一文件系统类型下的所有超级块组成了双向链表,fs_supers 字段是链表头元素,超级块对象的 s_instances 指向相邻元素。
  • 安装的子文件系统也会组成一个双向链表,已安装文件系统描述符中的 mnt_mounts 字段为头元素,mnt_child 字段指向相邻元素。
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值