【Linux Kernel】虚拟文件系统初探

news2024/12/28 7:00:07

学无止境~   看LKD进行的粗浅整理,目标是能够做到设计上面的理解~

Linux操作系统上支持多种文件系统,如本地文件系统EXT4、XFS、EXT3 等,同时还支持NFS、CIFS以及一些特殊的文件系统,同时在上层调用文件管理时又不感知不同文件系统的类型、存储的类型,之所以能做到这一点,最大的功臣就是虚拟文件系统,英文简称VFS。
VFS是定义一个通用的文件模型,满足上层对文件的处理应用,同时能够完整兼容所有文件系统的特殊需求和能力。

e149573a2348427fa5a4727d88829bb2.png

  之所以VFS能够屏蔽掉不同文件系统的差异,让上层无感我们以写文件为例

1619bf4a98d845e7a30e7cbf9d7f6762.png

vfs存在于用户与文件系统之间,这样就可以在虚拟文件系统层面实现屏蔽差异。

虽然内核整体采用C语言实现的,但是VFS本身的设计思想更多的是面向对象的,所以在使用C语言实现过程中会有些晦涩,整体思路是以结构体作为对象,对象的方法由不同的函数指针来实现。VFS中有几个关键的数据结构,分别是:超级块对象、索引节点对象、目录项对象、文件对象。下面的图可以简要描述这几个对象的关系:

ffe8f23043c9493abdfcedd3ef2551e5.png

 学习过程中, 我也是围绕这几个关键的数据结构进行的理解。

超级块对象(super_block)

代表已安装的具体的文件系统,存储的事文件系统本身的一些信息,通常对应于磁盘或分区特定扇区中的文件系统超级块或控制块。

索引节点对象(inode)

代表具体文件,在Linux一切皆文件,所以索引节点不仅代表传统意义上的文件,还有如目录等;主要包含了内核在操作文件时需要的全部信息。

文件对象

这个名字很容易被误解,会与inode搞混,文件对象描述的是由进程打开的文件,即同一个目录项由不同进程打开就会生成不同的文件对象, 换句话说文件对象是与进程相互绑定的,文件对象为进程提供了打开文件的相关信息与交互接口。

目录项对象(dentry)

是路径的一个组成部分,开始学习时很难理解目录项对象,目录项对象与Linux应用中传统意义上的文件夹不是等同或相近的。目录项对象的引入是为了解决文件查找繁琐的问题,所以目录项对象更多的意义在于文件与文件之间的关系,如/var/log/messages 这个文件中,包含的目录项对象有: /   var/ log/ messages 四个, 其中 根目录、var目录、log目录是不同层级的文件夹,messages是一个文件。

目录项对象还有一个比较重要的参数是状态,不同状态描述如下:

  • 空闲:没有被vfs使用,内存由slab处理,无关联inode
  • 未使用:没有被内核使用(d_count = 0),有关联的inode
  • 正在使用:正在被内核使用(d_count >0),有关联的inode,不能被丢弃
  • 负状态:有inode(被删除或不存在的)d_inode = NULL

既然目录项是为了方便查找,那么就需要一定的数据结构或设计方案来支持这一特性,其中目录项高速缓存解决了这一问题。目录项高速缓存由两个结构体组成:

  • 一个双向链表,包含了正在使用、未被使用、负状态的目录项对象,该双向链表形成一个先进先出的执行队列。以此实现一个“最近最少使用(LRU)”的缓存
  • 一个散列表,通过目录名和文件名从中能够快速获取一个目录项对象(目录项对象中与inode相关联,找到对应的目录项对象就能够定位到inode)

语言描述往往很难理解, 所以我就以查找/var/log/messages这个文件为例子描述一下目录项查找的逻辑:
查找一个文件的目录项查询逻辑
目标:查找/var/log/messages
高速缓存工作流如下:
1. 查找LRU链表:首先,文件系统会检查目录项高速缓存中的最近最少使用(LRU)链表。这是为了快速查找最近被访问过的目录项。如果目标文件(在这里是 `messages`)的目录项恰好位于LRU链表的头部或近期被访问过,那么它可能会直接从缓存中提取出来,避免了进一步的磁盘访问。

2. 查找散列表:如果LRU链表中没有找到目标目录项,文件系统会转向散列表(通常称为哈希表)。散列表根据目录项的名称进行快速查找。这里,文件系统会按照路径组件(`/`、`var`、`log`、`messages`)的顺序,逐个查找每个组件的目录项。每个找到的目录项都会成为下一个查找步骤的起点。

  •    首先,查找根目录(`/`)的目录项。
  •    然后,使用根目录的目录项作为起点,查找 `var` 子目录的目录项。
  •    接着,使用 `var` 目录项作为起点,查找 `log` 子目录的目录项。
  •    最后,使用 `log` 目录项作为起点,查找 `messages` 文件的目录项。

   在每个步骤中,如果目录项在散列表中不存在,那么它会根据需要从磁盘上读取,并添加到散列表和相应的链表中(例如,最近使用链表)。

3. 添加新目录项:如果在查找过程中发现某个目录项在缓存中不存在,那么该目录项会从磁盘上读取出来,并被添加到目录项高速缓存中。新添加的目录项会被放置在最近使用链表的头部,表示它是最近访问过的。

4. 缓存管理:随着时间的推移,当缓存空间不足时,文件系统会根据一定的策略(如LRU算法)从缓存中移除最少使用的目录项,以释放内存空间
以上逻辑就能够明白目录项的作用和逻辑了。

除了上述4个重要的数据结构外,还有一些特定的数据结构:
与文件相关的数据结构

  • file_system_type: 特定的文件类型
  • vfsmount:代表一个安装点

与进程相关的数据结构

  • files_struct: 与进程相关的文件信息(如:一个进程最多能够打开多少个文件等配置)
  • fs_struct:文件系统和进程的相关信息(如:pwd,进程根目录等)
  • mmt_namespace:单进程命名空间,进程在系统中能够看到的唯一的安装文件系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1467354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零样本带解释性的医学大模型

带解释性的医学大模型 提出背景解法拆解方法的原因对比以前解法 零样本带解释性的医学大模型如何使用CLIP模型和ChatGPT来进行零样本医学图像分类用特定提示查询ChatGPT所生成的医学视觉特征描述相似性得分在不同症状上的可视化,用于解释模型的预测注意力图的可视化…

高级FPGA开发之PCIe IP Core(三)

高级FPGA开发之PCIe IP Core(三) 一、PCIe IP核简介 通过阅读PCIe spec文档,可以看到UltraScale器件Integrated Block For PCI Express解决方案IP核是具备高带宽、高可缩放性和高可靠串行互联的解决方案,适用于UltraScale器件。赛灵思在 UltraScale 架…

Android 相机启动流程笔记

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、Camera 框架介绍: Camera的框架分为Kernel部分和hal部分,其中kernel部分主要有两块: image sensor driver&…

并发锁机制之深入理解synchronized

并发锁机制之深入理解synchronized Synchronized基础知识 i的JVM字节码指令 getstatic i // 获取静态变量i的值 iconst_1 // 将int常量1压入操作数栈 iadd // 自增 i–的JVM字节码指令 getstatic i // 获取静态变量i的值 iconst_1 // 将int常量1压入操作数栈 isub // 自减…

性能优化——canvas 加载海量图

背景 公司的在线设计稿平台的画板列表页开发时由于数据量不足,未能测出关于画板列表页性能问题,在经过用户一段时间的使用后出现了关于初始化卡顿、缩放卡顿等问题,画板列表页采用了vue-konva 原因 关于画板列表为何卡顿有如下几点原因 1、…

2月24日(周六)比赛前瞻:曼联 VS 富勒姆、拜仁 VS 莱比锡

大家好,博主将持续更新胜负14场前瞻,此处每日赛事间歇更新,胃信号每日更新。 精选赛事:曼联 VS 富勒姆 曼联近期状态显著提升,上一轮联赛客场2-1战胜卢顿,连续7场正赛取得6胜1平的成绩,保持不败…

6.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-通过逆向分析确定游戏明文发送数据过程

内容参考于:易道云信息技术研究院VIP课 上一个内容:测试需求与需求拆解 在开始之前要了解一个小知识,在逆向开始之前要很清楚知道要找的东西是什么,大概长什么样子,只有这样才能看到它第一眼发现它,现在我…

Qt+VTK鼠标拾取点生成拉伸闭合三维体

程序示例精选 QtVTK鼠标拾取点生成拉伸闭合三维体 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《QtVTK鼠标拾取点生成拉伸闭合三维体》编写代码,代码整洁,规则&…

ES6内置对象 - Map

Map(Map对象保存键值对,键值均不限制类型) 特点: 有序(Set集合是无序的);键值对(键可以是任意类型);键名不能重复(如果重复,则覆盖&…

从ViT到MAE,transformer架构改造Autoencoder

Vision Transformer (ViT) 论文出处[2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale (arxiv.org) 传统的卷积神经网络(CNN)在图像分类、目标检测等任务上表现出色,但其局限性也逐渐显露&#xf…

【大数据】Flink 内存管理(二):JobManager 内存分配(含实际计算案例)

Flink 内存管理(二):JobManager 内存分配 1.分配 Total Process Size2.分配 Total Flink Size3.单独分配 Heap Size4.分配 Total Process Size 和 Heap Size5.分配 Total Flink Size 和 Heap Size JobManager 是 Flink 集群的控制元素。它由三…

virtualenv env_name 使用 virtualenv 创建 python 虚拟环境

为什么要用这个 win7 32 环境下 pycharm 只能用低版本的,比如 2016,2018 此时pycharm 图形界面创建的 虚拟环境版本很低,有些包不兼容,因此用 virtualenv 模块,可以创建 20 版本以上的虚拟环境 virtualenv env_name官方文档 http…

全面解析企业财务报表系列之四:财务报表的真实性和可靠性

全面解析企业财务报表系列之四:财务报表的真实性和可靠性 一、什么是会计方法二、选择会计方法三、会计方法的重要性四、会计报表常用的造假手段五、财务报表经常被遗漏的重要事件六、财务报告造假的资信敏感性七、财务报告审计的重要性八、审计报告 一、什么是会计…

nginx重新编译添加模块或去除不需要的模块

在使用nginx中,我们可能需要对已经安装的nginx进行添加或者删除模块 1、先查看nginx安装了哪一些模块 nginx -V2、来到nginx源码目录,根据如下规则,自行根据需求更改命令 如果要去掉nginx自带的模块,就是用–without做为前缀进…

Stable Diffusion 绘画入门教程(webui)-ControlNet(IP2P)

上篇文章介绍了深度Depth,这篇文章介绍下IP2P(InstructP2P), 通俗理解就是图生图,给原有图加一些效果,比如下图,左边为原图,右边为增加了效果的图: 文章目录 一、选大模型二、写提示词三、基础参…

Siamfc论文中文翻译(详细!)

Fully-Convolutional Siamese Networks for Object Tracking 用于对象跟踪的Siamese网络 说明 建议对照siamfc(2021版)原文阅读,翻译软件翻译出来的效果不好,整体阅读体验不佳,所以我对译文重新进行了整理&#xff0…

5分钟JavaScript快速入门

目录 一.JavaScript基础语法 二.JavaScript的引入方式 三.JavaScript中的数组 四.BOM对象集合 五.DOM对象集合 六.事件监听 使用addEventListener()方法添加事件监听器 使用onX属性直接指定事件处理函数 使用removeEventListener()方法移除事件监听器 一.JavaScript基础…

悄悄话花费的时间(C语言)【二叉树各结点统计求和】

题目描述 给定一个二叉树,每个节点上站着一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。 初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二叉树所有节点上的人都接收到悄悄话花费的时间。 输入描述 …

element导航菜单el-menu添加搜索功能

element导航菜单-侧栏&#xff0c;自带的功能没有搜索或者模糊查询。 找了找资料 找到一个比较可行的&#xff0c;记录一下&#xff1a; //index.vue的代码 <div style"overflow:auto"><el-menu :default-active"$route.path":default-openeds&…

如何在 Tomcat 中为 Web 应用程序启用和配置缓存?

在Tomcat中为Web应用程序启用和配置缓存通常涉及到对Tomcat的连接器&#xff08;Connector&#xff09;进行配置&#xff0c;以及可能的话&#xff0c;配置Web应用程序本身以支持缓存。 1. 配置Tomcat连接器以启用缓存 Tomcat的连接器可以通过其配置来启用各种…