linux文件系统dentry_文件系统中超级块、inode和dentry三者的分析

原标题:文件系统中超级块、inode和dentry三者的分析

文件系统是用于存储和组织文件的一种机制,便于对文件进行方便的查找与访问。

而随着文件种类的增多,扩增了更多的文件系统,为了对各种文件系统进行统一的管理与组织。Linux将文件系统分为了两层,如下图所示:

36c5fe422fc2b75f70d582fff9eaec79.png

上图中VFS并不是一种实际的文件系统,它只存在于内存中,不存在任何外存空间,VFS在系统启动时建立,在系统关闭时消亡。另外,该VFS由超级块、inode、dentry、vfsmount等结构来组成。

为了对文件系统进行统一的管理与组织,Linux创建了一个公共根目录和全局文件系统树。要访问一个文件系统中的文件,必须先将这个文件系统挂载在全局文件系统树的某个根目录下,这一挂载过程被称作文件系统的挂载,所挂载的目录称为挂载点。

传统的文件系统在磁盘上的布局如下:

9cf64c71ba3d6c48b5917348c70b49fe.png

由上图可知,文件系统的开头通常是由一个磁盘扇区所组成的引导块,该部分的主要目的是用于对操作系统的引导。一般只在启动操作系统时使用。

随后是超级块,超级块主要存放了该物理磁盘中文件系统结构的相关信息,并且对各个部分的大小进行说明。

最后由i节点位图,逻辑块位图、i节点、逻辑块这几部分分布在物理磁盘上。

Linux为了对超级块,i节点,逻辑块这三部分进行高效的管理,Linux创建了几种不同的数据结构,分别是文件系统类型、inode、dentry等几种。

其中,文件系统类型规定了某种文件系统的行为,利用该数据结构可以构造某种文件系统类型的实例,另外,该实例也被称为超级块实例。

超级块则是反映了文件系统整体的控制信息。超级块能够以多种的方式存在,对于基于磁盘的文件系统,它以特定的格式存在于磁盘的固定区域(取决于文件系统类型)上。在挂载文件系统时,该超级块中的内容被读入磁盘中,从而构建出位于内存中的新的超级块。

inode则反映了文件系统对象中的一般元数据信息。dentry则是反映出某个文件系统对象在全局文件系统树中的位置。

为此,Linux对这四种数据结构进行了相关的关联。如下图:

59bdb8ea4edd7e6fc78f9ed5f56e7864.png

结合上述的文件系统在物理磁盘的分布,以及数据结构之间的关联,可以分析出文件系统的一个简单的挂载与应用的过程。

Linux将一切看作文件来进行处理,因此u盘这些存储设备可以看作是某一种文件系统。当u盘插上后,u盘中的文件系统将会被挂载到操作系统上,同时u盘的超级块也会被读入内存中生成新的超级块。

利用内存中的超级块,可以找到u盘中的各个文件所对应的inode,而inode结构中i_mapping与i_data字段则实际的映射了文件在物理磁盘中的地址空间。

需要注意的是,目录也被看做是文件的一种,因此dentry也具有对应的inode,所以inode和dentry可以看作是相互对应的。

这里可以通过内核中do_lookup函数来确定inode与dentry之间的寻找关系。

3b11bd5af78c047a3ef89e9630b779bd.png

ec72eb8d56ed15ceb578907efbdb6d05.png

接下来对该函数进行分析,该函数的主要作用适用于对文件路径中单个分量的解析。其中,参数所代表的含义分别为,第一个参数为指向包含要查找分量所在目录的路径查找上下文的指针;第二个参数表示要查找分量的字符串和哈希值;打三个参数为返回值,保存了目标路径。

struct path结构体中主要包含了两个成员变量,分别是struct vfsmount,struct dentry。前者指向文件系统装载对象的指针,后者指向目录项对象的指针。

struct nameidata结构体中,主要有以下几个字段,分别是:用于保存已找到的路径的struct path、路径名中最后一个组件的名字struct qstr、查询的根路径(struct path) root。

struct qstr结构体主要用来保存当前分量的相关信息,比如:字符串的哈希值、长度以及字符串本身。

do_lookup函数首先对该分量所对应的目录操作表以及目录操作表中的哈希函数进行了检测,查看其是否存在。如果存在,则通过__d_lookup函数来获取一个dentry,如果该dentry获取到,则将struct path结构中的字段进行设置。随后并利用__follow_mount函数来进行后续的处理。如果没有找到所需的dentry,则将当前的相关目录信息设置为父目录,从而进行相关的处理,比兔:根据inode进行的一些检测等。

通过以上的分析,可见dentry与inode之间的关系为,获取到dentry后,再获取其对应的inode,并利用该inode来对dentry进行相关的检测,当检测结束后,在利用inode其中的i_mapping等字段来进行空间映射,从而实现读/写行为。返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值