Linux内核学习(九)—— 虚拟文件系统(基于Linux 2.6内核)

news2024/11/17 16:49:06

虚拟文件系统(VFS)作为内核子系统,为用户空间程序提供了文件和文件系统相关的接口。通过虚拟文件系统,程序可以利用标准的 Unix 系统调用对不同的文件系统(甚至不同介质上的文件系统)进行读写操作。

一、通用文件系统接口

VFS 可以使得用户可以直接使用 open()、read() 和 write() 等文件相关系统调用,而不需要考虑具体文件系统和实际物理介质。VFS 与块 I/O 相结合,提供抽象、接口,使得用户空间的程序调用统一的系统调用访问各种文件。

二、文件系统抽象层

内核在所有类型的文件系统接口上建立了一个抽象层,该抽象层使 Linux 能够支持各种文件系统。

VFS 之所以能衔接各种各样的文件系统,是因为它定义了所有文件系统都支持的、基本的、概念上的接口和数据结构。而实际的文件系统通过编程提供 VFS 所期望的抽象接口和数据结构,这样,内核就可以毫不费力地连接在一起。

如下面这个例子:

ret = write(fd, buf, len)

该系统调用将 buf 指针指向的长度为 len 字节的数据写入文件描述符 fd 对应的文件的当前位置。这个系统调用首先执行 sys_write() 系统调用函数,该函数要找到 fd 所在的文件系统所实现的写操作,然后再执行该操作,数据最终通过该操作写入介质。

三、Unix 文件系统

Unix 有四种与文件系统相关的传统抽象概念:文件、目录项、索引节点和挂载点(mount point)。

从本质上讲文件系统是特殊的数据分层存储结构,它包含文件、目录和相关的控制信息。文件系统的通用操作包含创建、删除和挂载等。在 Unix 中,文件系统被安装到一个特定的挂载点上,该挂载点在全局层次结构中被称为命名空间,所有的已安装文件系统都作为根文件系统树的枝叶出现在系统中。

VFS 把目录当作文件对待,所以可以对目录执行和文件相同的操作。

Unix 系统将文件的相关信息和文件本身这两个概念加以区分,例如访问控制权限、大小、拥有者等信息。文件相关信息也被称作文件的元数据,被存储在一个单独的数据结构中,这个结构被称为索引结点(inode)。文件系统的信息则存储在超级块中,超级块是一种包含文件系统信息的数据结构。

比如说在磁盘上,文件(目录也属于文件)信息按照索引节点的形式存储在单独的块中;控制信息被集中存储在磁盘的超级块中。

四、VFS 对象及其数据结构

VFS 采用的是面向对象的设计思路,使用一组数据结构来代表通用文件对象。这些结构体包含数据的同时也包含操作这些数据的函数指针,其中的操作函数由具体的文件系统实现。

VFS 有四个主要的对象类型,分别是:

  • 超级块对象,代表一个具体的已安装文件系统。、
  • 索引节点对象,它代表一个具体文件。
  • 目录项对象,它代表一个目录项,是路径的一个组成部分(注:目录项不同于目录,目录属于文件对象)。
  • 文件对象,它代表由进程打开的文件。

上述每个对象都包含一个对应的操作对象,这些操作对象描述了内核针对主要对象可以使用的方法:

  • super_operations 对象,包含内核针对特定文件系统能调用的方法,比如 write_inode() 和 sync_fs() 等方法。
  • inode_operations 对象,包含内核针对特定文件能调用的方法,比如 create() 和 link()。
  • dentry_operations 对象,包含内核针对特定目录所能调用的方法,如 d_compare() 和 d_delete()。
  • file_operations 对象,包含进程针对已打开文件所能调用的方法,比如 read() 和 write()。

操作对象作为一个结构体指针来实现,里面包含指向操作其父对象的函数指针。对于其中许多方法来说,可以继承使用 VFS 提供的通用函数,如果通用函数的功能无法满足需要,那么就必须使用实际文件系统独有的方法来填充这些函数指针。

五、超级块对象

各种文件系统都必须实现超级块对象,该对象用于存储特定文件系统的信息,通常对应于存放在磁盘特定扇区中的文件系统超级块或文件系统控制块。对于并非基于磁盘的文件系统(如基于内存的文件系统,sysfs),它们会在使用现场创建超级块并将其保存到内存中。

超级块对象由 super_block 结构体表示,定义在文件 <linux/fs.h> 中:

 

六、索引节点对象

索引节点对象包含了内核在操作文件或目录时需要的全部信息。索引节点对象与其对应的文件是分开存放的。索引节点对象由 inode 结构体表示,定义在文件 <linux/fs.h> 中:

 

一个索引节点代表文件系统中的一个文件,它也可以是设备或管道这样的特殊文件。因此索引节点结构体中有一些和特殊文件相关的项,如 i_pipe 项就指向一个代表有名管道的数据结构,i_bdev 指向块设备结构体,i_cdev 指向字符设备结构体。

索引节点对象的 inode_operations 项也非常重要,因为它描述了 VFS 用以操作索引节点对象的所有方法,这些方法由文件系统实现。

inode->inode_operations->对应操作函数

 

七、目录项对象

VFS 把目录当作文件来对待,所以在路径 /bin/vi 中,bin 和 vi 都属于文件,bin为目录文件而 vi 是一个普通文件,路径中的每个组成部分都由一个索引节点对象表示。

为了方便查找操作,VFS 引入了目录项,每个目录项代表路径中的一个特定部分,如 前面的 /、bin 和 vi 都属于目录项的概念。在路径中的每一个部分都是目录项对象,目录项的引入可以让文件的查找变得更加方便。

目录项对象由 dentry 结构体表示,定义在文件 <linux/dcache.h> 中:

与前面两个对象不同,目录项没有对应的磁盘数据结构,VFS 根据字符串形式的路径名现场创建它。由于目录项并非真正保存在磁盘上,所以目录项结构体没用是否被修改的标志。

目录项有三种有效状态:被使用、未被使用和负状态。

  • 一个被使用的目录项对应一个有效的索引节点(即 d_inode 指向相应的索引节点),并且表明该对象存在一个或多个使用者(d_count 为正值)。
  • 一个未被使用的目录项对应一个有效的索引节点(d_inode 指向一个索引节点), 但是应指明 VFS 当前并未使用它(d_count 为 0)。该目录项对象仍然指向一个有效对象,而且保留在缓存中以便需要时再使用它,所以之后再需要它时不需要重新创建。
  • 一个负状态的目录项(或者说无效目录项)没有对应的有效索引节点(d_inode 为 NULL),因为索引节点已被删除了,或路径不再正确了,但目录项仍保留。

如果 VFS 遍历路径名中所有的元素并将它们逐个地解析成目录项对象,还要达到最深层目录,将是一件非常费力的工作,所以内核将目录项对象缓存再目录项缓存中(简称 dcache),以节省时间。 

八、文件对象

文件对象表示进程已打开的文件。该对象由相应的 open() 系统调用创建,由 close() 系统调用撤销。因为多个进程可以同时打开和操作同一个文件,所以同一个文件也可能存在多个对应的文件对象。虽然一个文件对应的文件对象不是唯一的,但对应的索引节点和目录项对象是唯一的。

文件对象由 file 结构体表示,定义在 <linux/fs.h> 中:

 

 类似于目录项对象,文件对象实际上没有对应的磁盘数据,只有当一个文件被进程打开时才被创建。

文件对象的操作如下:

 

 

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

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

相关文章

人力资源小程序的设计原则与实现方法

随着移动互联网的快速发展&#xff0c;小程序成为了各行各业推广和服务的新利器。对于人力资源行业来说&#xff0c;开发一款定制化的小程序不仅可以提升服务效率&#xff0c;还可以增强品牌形象和用户粘性。那么&#xff0c;如何定制开发人力资源类的小程序呢&#xff1f;下面…

数组和指针练习解析(6)

题目&#xff1a; int main() { char *c[] {"ENTER","NEW","POINT","FIRST"}; char**cp[] {c3,c2,c1,c}; char***cpp cp; printf("%s\n", **cpp); printf("%s\n", *--*cpp3)&#xff1b; printf("%s\n&…

Unity3D Pico VR 手势识别

本文章使用的 Unity3D版本: 2021.3.6 , Pico SDK 230 ,Pico OS v.5.7.1 硬件Pico 4 Pico SDK可以去Pico官网下载SDK 导入SDK 第一步&#xff1a;创建Unity3D项目 第二步&#xff1a;导入 PICO Unity Integration SDK 选择 Windows > Package Manager。 在 Packag…

巴别塔再现?高质量端到端数据助力Meta推出AI模型SeamlessM4T

追求卓越与无限的精神一直流淌在人类的基因里。圣经中有故事&#xff1a;在古代&#xff0c;人们说着同一种语言&#xff0c;决定建造一座高耸入云&#xff0c;塔顶能触及天堂的塔&#xff0c;被称为巴别塔&#xff0c;以彰显人类的力量和创造力。然而上帝看到人类的意图&#…

数据科学 × 临床医学丨和鲸打造可供科研多角色协同的低代码研究平台

领域背景&#xff1a;临床研究的“多角色”性 临床研究是以疾病的诊断、治疗、预后和病因为主要研究内容&#xff0c;以患者为主要研究对象的科学研究活动。现代临床研究项目的开展具有“多角色”参与的特性&#xff0c;除了发起项目的 PI 外&#xff0c;项目的核心团队可能还…

14-模型 - 增删改查

增: # 1. 找到模型类并创建对象 user User() # 2. 给对象的属性赋值 user.username username user.password password user.phone phone # 3. 将user对象添加到session中 (类似缓存) db.session.add(user) # 4. 提交数据 db.session.commit() 删: # 两种删除:# 1. 逻辑删…

C++核心编程:类和对象

总览 C 面向对象的三大特性&#xff1a; 封装&#xff0c;继承&#xff0c;多态 C认为 万事万物都皆为对象&#xff0c;对象上有其属性和行为 封装 封装的意义 封装是C面向对象的三大特征之一 封装的意义&#xff1a; 将属性和行为作为一个整体&#xff0c;表现生活中的事…

芯科科技推出专为Amazon Sidewalk优化的全新片上系统和开发工具,加速Sidewalk网络采用

芯科科技为Sidewalk开发提供专家级支持 中国&#xff0c;北京 - 2023年8月22日 – 致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;今日在其一年一度的第四…

安防监控平台EasyCVR视频汇聚平台增加首页告警类型的详细介绍

安防监控/视频集中存储/云存储EasyCVR视频汇聚平台&#xff0c;可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等…

kubernetes--技术文档--可视化管理界面dashboard安装部署

阿丹&#xff1a; 使用官方提供的可视化界面来完成。 Kubernetes Dashboard是Kubernetes集群的Web UI&#xff0c;用户可以通过Dashboard进行管理集群内所有资源对象&#xff0c;例如查看资源对象的运行情况&#xff0c;部署新的资源对象&#xff0c;伸缩Deployment中的Pod数量…

SAP 之如何定义功能范围Function Area

目录 目录 前言 一、注意点 二、使用步骤 1. Step by step 2. 其它功能 总结 前言 在SAP中&#xff0c;FA功能范围是一个组织单元&#xff0c;一般根据活动对产生的运营费用进行分类。例如生产、管理、销售、研发等&#xff0c;可以分配给成本中心Cctr、GL总账科目、Ord…

电压放大器的用途有哪些

电压放大器是一种常见的电子设备&#xff0c;用于将输入信号的电压放大到所需的输出电压水平。它在各种领域中都有广泛的应用。下面西安安泰电子将介绍电压放大器的主要用途。 音频放大&#xff1a;电压放大器在音频领域中扮演着重要角色。音频放大器是电压放大器的一种特殊形式…

支付事-乐刷支付母公司移卡发布2023年中期业绩报告

8月24日晚间&#xff0c;乐刷支付母公司移卡发布2023年中期业绩报告。 2023年上半年&#xff0c;移卡实现收入20.62亿元&#xff0c;同比增长25.6%&#xff1b;经调整EBITDA2.91亿元&#xff1b;同比增长317.4%。业绩表现优异主要来源于主营支付业务的大幅增长。 中期业绩报告…

MIA文献阅读 —— 深度学习在医学图像分析中的最新进展及临床应用【2022】

目录 0 摘要1 引言2 深度学习方法概述2.1 监督式学习2.2 无监督学习2.2.1 自编码器 (Autoencoders)2.2.2 生成对抗网络(GANs)2.2.3 自监督学习 2.3. 半监督学习2.4 提高性能的策略2.4.1 注意力机制2.4.2 领域知识2.4.3 估计的不确定性 3 深度学习应用3.1 分类3.1.1 监督分类3.1…

Camunda 7.x 系列【28】定时器启动事件

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2. 概述3. 案例演示3.1 建模3.2 固定时间日期3.2 持续时间3.3 重复间隔1. 前言 Sta…

qml相关知识1

qml相关知识1 QtQuick.Controls 哪个版本支持TreeModel 和 TreeItemqt5.12开始&#xff0c;TreeItem 类被删除&#xff0c;无法使用delegate 什么时候可以用Qt5.15中没有 import QtQuick.Controls 1吗&#xff0c;哪个版本有control1qml如何两种版本的controls混用&#xff08;…

2023中国算力大会 | 中科驭数加入DPU推进计划,探讨DPU如何激活算网融合新基建

8月18日&#xff0c;由工业和信息化部、宁夏回族自治区人民政府共同主办的2023中国算力大会在宁夏银川隆重召开。作为DPU算力基础设施领军企业&#xff0c;中科驭数产品运营部副总经理曹辉受邀在中国信通院承办的算网融合分论坛发表主题演讲《释放极致算力 DPU激活算网融合新基…

SMC状态机 讲解1 XX.sm文件详解

SMC状态机 讲解1.4 XX.sm文件 1、Task类2、FSM任务3、创建SMC.sm文件4、定义FSM状态5、定义转换 transition6、定义FSM转换动作7、定义FSM默认转换8、定义状态Entry/Exit 动作9、连接Task与Task FSM 1、Task类 SMC为对象(不是进程或应用程序&#xff0c;而是单个对象)生成有限…

IT运维:使用数据分析平台监控DELL服务器

概述 在企业日常运维中&#xff0c;我们有着大量的服务器设备&#xff0c;设备故障一般可以通过常用的监控软件实现自动告警&#xff0c;但如果在管理运维中我们要做的不仅仅是发现故障&#xff0c;处理硬件故障&#xff0c;我们还需要进一步的了解&#xff0c;今年一共出现了多…

【Linux应用部署篇】在CSDN云IDE平台部署Etherpad文档编辑器

【Linux应用部署篇】在CSDN云IDE平台部署Etherpad文档编辑器 一、CSDN云IDE平台介绍1.1 CSDN云IDE平台简介1.2 CSDN云IDE平台特点 二、本次实践介绍2.1 本次实践介绍2.2 Etherpad简介 三、登录CSDN云IDE平台3.1 登录CSDN开发云3.2 登录云IDE3.3 新建工作空间3.4 进入工作空间 四…