查找子系统数据结构_[简译] VFS的相关数据结构和操作

bbdda1a95dc204e79e777f09724a1c28.png

最近看到几篇介绍VFS的韩语文章,觉得里面的众多绘图清晰易懂,冒昧将其摘选出来,分享给大家,希望大家可以从更多的角度去理解和认识VFS的构成和原理。原文地址位于 https://m.blog.naver.com/eldkrpdla121/220706907723,对应PPT链接在Ch 12 Virtual File System (VFS)。

正文

VFS的基本接口大家应该都比较熟悉了,比如open(), read(), write(), 而要知道这些基本操作的内核实现,得首先了解下构成VFS子系统的基础数据结构

22ca5a37f2094267f13e0d7ee3d9b531.png

superblock和inode都位于磁盘,它们分别是「文件系统」和「单个文件」的control block(称为"meta data"),同时inode还记录了文件在磁盘上的data block的分布(即"user data")。

c97bcdf966b0305edd3a756e96d05bef.png

【进程和文件

当进程试图访问磁盘上的一个文件时(比如执行open系统调用),需要将该文件的磁盘inode中的一部分信息拷贝到内存中,这部分内容进而构成了内存中的"struct inode"结构体。

3f9211b8ae0c5a60750e53fa77b566e6.png

之后,通过这个内存中的inode对象,就可以获取到所需访问的文件的内容。

43577c2408b90ba30a8bbaec86ec60b1.png

那如果有多个进程访问磁盘上的同一个文件呢?

19a05ac586a3241d7632ef5a4d094f3d.png

这就引出了另一重要的结构体"struct file","inode"对应磁盘上的文件实体,是全局的,而"file"记录的是进程和文件之间的关联,比如访问文件的位置(即"offset"),因而是进程私有的。

e42e40910625f19d358280aaf09632d0.png

有了这一关联,进程就可以通过file table,访问到文件的meta data,进而获取到文件的user data,实现对数据的读写等操作(比如readwrite系统调用)。

61725811447cf2e301eeb6fa525f9fe2.png

在描述进程的"task_struct"结构体中,由"files"域指向其打开文件的文件描述符表,由"fs"域指向其执行操作所在的目录和文件系统挂载点等相关信息。

ae07a38e64a86682116e35a68d30ebfe.png

【快速访问】

假设现在一个进程要在"/a/b/c/d/"目录下新建一个名称为"e"的文件,那么路径查找的过程大致如下:

6f1ee82cffc61a2a43d4ff41737b3f69.png

在VFS的概念里,「目录」被视作一种特殊的文件,也具有对应的inode对象。因而在整个查找过程中,需要将多达6个inode的内容拷贝到内存。

9d5f9d6d495c6a86ce9d4b3e62fb8344.png

如果能将之前获取的“路径结果”信息暂存起来(以dentry cache的形式),将大大加快路径访问的速度。

8a409276517d4ee8deb4ad8583b1d552.png

小结

可见,在构成VFS基石的四个数据结构中,"superblock"和"inode"是本就驻留在磁盘上(使用时会将其部分信息拷贝到内存中),而"file"和"dentry"则是为了文件访问的需要,在内存中诞生的,并不对应磁盘上的任何实体。

aec65df5744c61a4e2962d29bc322e36.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值