设备驱动与文件系统:06 目录与文件

news2025/6/9 8:48:48

磁盘使用的最后一层抽象:文件系统

今天我们讲第31讲,这一讲将完成磁盘对磁盘使用的最后一层抽象。对此板使用最后一层抽象,抽象出来的是什么呢?在这里插入图片描述
实际上我们使用过磁盘,大家应该有这样的认识,最后不管这个磁盘是在windows上,在linux上还是在什么系统下面,也不管它里面是什么样的格式,最后给用户的感觉就是一个目录树

这个目录从根目录开始,比如说底下可能有windows目录、system目录等等。也就是说,不管什么样的磁盘、在哪里,最后给用户展现出来的就是这样一棵目录树。既然是一棵目录树,那么这个目录树放在linux上应该好使,能形成一棵这样的树;放在windows上,也应该形成这样的树。所以,磁盘最后就形成了一个文件系统,它是一个子系统,可以独立工作
在这里插入图片描述
这个磁盘上面一旦抽象为这样的系统以后,在windows上的这个文件系统可以把硬盘拔下来放在linux上面,在linux上面能把这个目录数展开,并且在这个目录书中去相应地找到相应的文件来进行读写。这就是操作系统上对磁盘使用的最后一层抽象,整个磁盘变成一颗目录树

这一棵目录树里面放的是一堆文件,目录树是用来组织一堆文件的,这和前面我们讲的课程正好呼应。前面我们讲的是一个文件怎么找到那些盘块来读写,一个文件对应的是一个盘块集合,操作系统将文件这个字符流映射成一堆盘块。而今天要讲的文件系统,不是一个文件到一堆盘块的集合,因为整个磁盘上存放的是一堆文件,最终形成的是一堆文件以树状结构的组织方式

这种组织方式是给用户的一种感觉,实际上磁盘里面就是一堆盘块,它要完成将整个磁盘的所有盘块进行抽象组织,所谓抽象就是用数据结构进行组织。之前讲文件的时候用innode进行组织这些盘块形成一个字符序列,这里就是将整个磁盘按照一定的方式存放一定的信息,最后形成给用户的这样一种抽象的结构。

对于文件系统来说,就是将整个磁盘抽象成这个样子,在整个磁盘上要存放一些信息,比如位图等。在磁盘块上,磁盘操作系统在一堆盘块上存放各种各样的信息,这些信息经过操作系统读、维护以后,就形成了这样一个样子。反过来,用户给出使用方式,操作系统负责将这个方式根据在磁盘块维护的数据结构和抽象关系,把用户抽象的使用最后落实为盘块的读写。因为整个磁盘的使用,最后必须是扇区的使用,用out发出c h s才好使。

从下往上说,文件系统就是形成将整个磁盘的盘块存储上面存储映射关系,维护结构,使得在用户眼里形成基于树状的目录树和文件组织结构;从上往下说,就是用户按照这种结构去存取、访问、管理文件,操作系统把用户的读写通过映射关系转化成对扇区的读写,最后落实到磁盘上。底层的结构是对上层的一种实现,而上层就是对底层这种抽象,用户眼里看到的就是这个目录树,这个目录树可以放在不同机器、不同操作系统上展开。
在这里插入图片描述

由此可以看出来,今天要讲的就是操作系统如何完成这个映射,完成从一堆文件到整个磁盘的映射,核心就是多个文件怎么处理。为什么我们总是说树状结构呢?在操作系统发展史上,它有一个演变的过程。最开始操作系统的一堆文件就放在一层,没有目录概念,这样在一个系统中有成千上万文件时,查找非常困难,不方便用户使用。后来尝试一个用户一个,但每个用户的文件垒在一起数量还是很多,也不好用。所以才引出了目录树的结构,目录树是典型的分层,这种结构清晰、可扩展性好,方便用户使用
在这里插入图片描述

目录树结构中产生了目录这个概念,通过目录形成树状结构,实现这个结构就是对多个文件的组织结构。而实现这个结构的核心就在于目录的实现,将目录实现了,树状结构就有了,多个文件就能放到磁盘上。所以,目录实现成为关键,首先要明白目录怎么用。
在这里插入图片描述

用户使用目录形成这样一种结构对应的是程序,我们要解析用户在程序中使用目录的方式。用户从上面发下来的是一个路径名,open这个路径名时,这个路径名实际上就是从树根到某个节点的一条路,形成了树状结构。我们要做到的核心事情是根据这个路径名找到文件对应的fcb,上次讲已知文件的innode就能读写文件,现在是给一个路径,找到文件的innode,再和前面的知识衔接,就可以访问整个目录树。

所以,最关键的就是给一个路径名,根据树状结构产生的路径名,得到文件的fcb,完成路径名到fcb的映射,再通过fcb映射到盘块,最后落实到磁盘扇区的映射。完成这样的映射,操作系统就能实现出一颗目录树,用户就能在目录树上按照一定方式使用。

如何根据路径名找到fcb

拉回话题,我们讲最关键的问题,怎么根据路径名找到fcb呢?关键就在于目录中存放的到底是什么,目录是怎么实现的,核心就是磁盘块上应该存放什么信息来实现目录

我们来看,目录中应该有什么呢?比如my目录下有data目录、count文件等三个文件,目录也是一个文件。那么目录中应该存放什么才能根据my找到里面的文件呢?直观想法是,my目录下能不能存放里面所有文件的fcb信息,把所有文件的fcb放在一起存在my目录下,找到my后把这些fcb全读出来挨个匹配,的确是一种方案,但这种方案比较慢。

my目录要找到里面文件,需要匹配文件名这个字符串,根据字符串找到对应的fcb。如果把目录下所有文件的fcb全部存放起来,在解析时,因为不知道要找的文件在哪,需要把所有目录项(文件名和fcb)全部读到内存里挨个匹配,很多fcb信息读进来是没有用的,浪费磁盘读取,因为磁盘很慢,所以需要优化。
在这里插入图片描述
那目录下到底应该存放什么呢?字符串必须有用于匹配,但fcb太大不能存放,还要能通过匹配找到fcb,所以可以存放一个编号。可以把fcb形成一个数组,编号就是数组中的第几项,知道编号和每个fcb的固定长度,就能算出在数组中的位置,进而知道盘块号,发出盘块号的读写就能读出对应的fcb。

这样,一个目录项中存放的是一个字符串加编号,相比存放完整fcb信息短很多,读进来解析快,浪费少。找到目标后,根据编号通过换算能找到对应的盘块和fcb,逐层向下类推,就能找到路径中终点的fcb,这就是目录的完整实现。

目录实现与磁盘格式化

从根目录开始,根目录没有其他信息告知其位置,所以根目录必须固定,一般放在固定位置,比如fcb数组中的第一项(编号为0)。但根目录不能在磁盘第一块,因为前面还要放一些信息,如磁盘大小、能存放文件数量等。
在这里插入图片描述

磁盘格式化时,需要记录根目录位置,记录的信息可以放在磁盘固定位置。这样,磁盘从一个机器插到另一个机器上,读取磁盘信息就能找到根目录。一旦找到根目录,它是个文件,根据根目录fcb中存放的信息就能找到其数据块,数据块里就是根目录存放的内容,即根目录下各个文件的位置信息(文件名和对应的fcb编号),再根据这些信息继续查找,就能找到其他文件。

要想整个文件系统能独立工作,磁盘插到不同机器上都能正常使用,还需要一些信息。关键在于根目录信息,所以整个磁盘要被格式化成特定样子,才能完成目录树解析,根据路径名从根目录开始找到目标文件的fcb。

磁盘格式化后,前面要放一个超级块,还可能有引导块(引导扇区固定大小)。超级块从磁盘0开始,引导块之后就是超级块,根据超级块里面的信息读出来,能获得一些关键信息,如不同区域长度等。通过这些信息就能算出根目录位置,一旦知道根目录位置,后面的目录树内容就能读进来,目录树就有了。

磁盘格式化后的工作与文件读写流程

一个磁盘格式化成这样以后,插到任何地方,通过读固定位置的超级块,解析里面的内容,就可以找到根目录,并且还可以读写文件、修改维护数据结构、申请新的空闲块、申请和释放innode等。

这样,我们就完成了一堆文件在磁盘上目录树结构的实现,核心是目录的实现和解析。为了找到根目录,需要将整个磁盘格式化成特定样子,有超级块、innode位图、空闲板块位图,在超级块里放一些信息来找到根目录。

到这里,理论部分全部结束,完成了全部映射。在这个映射下,磁盘是怎么使用的呢?在这里插入图片描述
比如用户要读文件的某段字节,我们做的工作首先是open这个文件,从根目录开始,根据磁盘格式化的样子,从super block里面找到根目录,再找到各级目录,最后找到目标文件的fcb。

然后是read操作,根据innode和要读取的位置信息,找到对应的盘块,比如通过索引、链表或数组等结构找到盘块号。找到盘块号后,用内层抽象的电梯算法将盘块放在电梯队列中。在磁盘中断的时候,把盘块取出来,根据硬件参数(在bios中已获得,实验一时也让大家得到过这些参数)算出c h s关键数字,通过alt发给磁盘控制器,磁盘控制器驱动马达去读盘块,找到读写位置,将信息读到内存里。

到此为止,磁盘驱动的全部故事结束了,下次课我们讲目录这一部分的代码实现,把代码实现完整起来,就能编写一个小的文件系统。大家回去可以做相关实验,虽然这次实验不是文件系统,是一种特殊问题p l o c文件,但我们曾说过有八个实验加四个大型实验,其中一个大型实验就是做一个小型文件系统,大家感兴趣可以去做。

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

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

相关文章

Linux 系统中的算法技巧与性能优化

引言​ Linux 系统以其开源、稳定和高度可定制的特性,在服务器端、嵌入式设备以及开发环境中得到了极为广泛的应用。对于开发者而言,不仅要掌握在 Linux 环境下实现各类算法的方法,更要知晓如何利用系统特性对算法进行优化,以提升…

【C++系列】模板类型特例化

1. C模板类型特例化介绍 ​​定义​​:模板类型特例化(Template Specialization)是C中为模板的特定类型提供定制实现的机制,允许开发者对通用模板无法处理的特殊类型进行优化或特殊处理。 ​​产生标准​​: C98/03…

K8S认证|CKS题库+答案| 7. Dockerfile 检测

目录 7. Dockerfile 检测 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、修改 Dockerfile 3)、 修改 deployment.yaml 7. Dockerfile 检测 免费获取并激活 CKA_v1.31_模拟系统 题目 您必须在以…

基于Scala实现Flink的三种基本时间窗口操作

目录 代码结构 代码解析 (1) 主程序入口 (2) 窗口联结(Window Join) (3) 间隔联结(Interval Join) (4) 窗口同组联结(CoGroup) (5) 执行任务 代码优化 (1) 时间戳分配 (2) 窗口大小 (3) 输出格式…

c++对halcon的动态链接库dll封装及调用(细细讲)

七个部分(是个大工程) 一,halcon封装函数导出cpp的内容介绍 二,c++中对halcon环境的配置 三,在配置环境下验证halcon代码 四,dll项目创建+环境配置 五,编辑dll及导出 六,调用打包好的动态链接库的配置 七,进行测试 一,halcon的封装及导出cpp的介绍 1,我这里…

【优选算法】分治

一&#xff1a;颜色分类 class Solution { public:void sortColors(vector<int>& nums) {// 三指针法int n nums.size();int left -1, right n, i 0;while(i < right){if(nums[i] 0) swap(nums[left], nums[i]);else if(nums[i] 2) swap(nums[--right], num…

【图片识别改名】如何批量将图片按图片上文字重命名?自动批量识别图片文字并命名,基于图片文字内容改名,WPF和京东ocr识别的解决方案

应用场景 在日常工作和生活中&#xff0c;我们经常会遇到需要对大量图片进行重命名的情况。例如&#xff0c;设计师可能需要根据图片内容为设计素材命名&#xff0c;文档管理人员可能需要根据扫描文档中的文字对图片进行分类命名。传统的手动重命名方式效率低下且容易出错&…

RabbitMQ 的高可用性

RabbitMQ 是比较有代表性的&#xff0c;因为是基于主从&#xff08;非分布式&#xff09;做高可用的RabbitMQ 有三种模式&#xff1a;单机模式、普通集群模式、镜像集群模式。 单机模式 单机模式,生产几乎不用。 普通集群模式&#xff08;无高可用性&#xff09; 普通集群模…

AI架构师修炼之道

1 AI时代的架构革命 与传统软件开发和软件架构师相比&#xff0c;AI架构师面临着三重范式转换&#xff1a; 1.1 技术维度&#xff0c;需处理异构算力调度与模型生命周期管理的复杂性&#xff1b; 1.2 系统维度&#xff0c;需平衡实时性与资源约束的矛盾&#xff1b; 1.3 价…

iview组件库:当后台返回到的数据与使用官网组件指定的字段不匹配时,进行修改某个属性名再将response数据渲染到页面上的处理

1、需求导入 当存在前端需要的数据的字段渲染到表格或者是一些公共的表格组件展示数据时的某个字段名与后台返回的字段不一致时&#xff0c;那么需要前端进行稍加处理&#xff0c;而不能直接this.list res.data;这样数据是渲染不出来的。 2、后台返回的数据类型 Datalist(pn) …

服务器 | Centos 9 系统中,如何部署SpringBoot后端项目?

系列文章目录 虚拟机 | Ubuntu 安装流程以及界面太小问题解决 虚拟机 | Ubuntu图形化系统&#xff1a; open-vm-tools安装失败以及实现文件拖放 虚拟机 | Ubuntu操作系统&#xff1a;su和sudo理解及如何处理忘记root密码 文章目录 系列文章目录前言一、环境介绍二、 使用syst…

(2025)Windows修改JupyterNotebook的字体,使用JetBrains Mono

(JetBrains Mono字体未下载就配置,这种情况我不知道能不能行,没做过实验,因为我电脑已经下载了,不可能删了那么多字体做实验,我的建议是下载JetBrains Mono字体,当你使用VsCode配置里面的JetBrains字体也很有用) 首先参考该文章下载字体到电脑上 VSCode 修改字体为JetBrains …

小番茄C盘清理:专业高效的电脑磁盘清理工具

在使用电脑的过程中&#xff0c;我们常常会遇到系统盘空间不足、磁盘碎片过多、垃圾文件堆积等问题&#xff0c;这些问题不仅会导致电脑运行缓慢&#xff0c;还可能引发系统崩溃。为了解决这些问题&#xff0c;小番茄C盘清理应运而生。它是一款专业的C盘清理软件&#xff0c;能…

AUTOSAR实战教程--标准协议栈实现DoIP转DoCAN的方法

目录 软件架构 关键知识点 第一:PDUR的缓存作用 第二:CANTP的组包拆包功能 第三:流控帧的意义 配置过程 步骤0:ECUC模块中PDU创建 步骤1:SoAD模块维持不变 步骤2:DoIP模块为Gateway功能添加Connection ​步骤3:DoIP模块为Gateway新增LA/TA/SA ​步骤4:PDUR模…

【MySQL系列】MySQL 导出表数据到文件

博客目录 一、使用 SELECT INTO OUTFILE 语句基本语法参数详解注意事项实际示例 二、使用 mysqldump 工具基本语法常用选项实际示例 三、使用 MySQL Workbench 导出导出步骤高级选项 四、其他导出方法1. 使用 mysql 命令行客户端2. 使用 LOAD DATA INFILE 的逆向操作3. 使用编程…

vue3:十五、管理员管理-页面搭建

一、页面效果 实现管理员页面,完成管理员对应角色的中文名称显示,实现搜索栏,表格基本增删改查,分页等功能 二、修改问题 1、修改搜索框传递参数问题 (1)问题图示 如下图,之前搜索后,传递的数据不直接是一个value值,而是如下图的格式 查询可知这里传递的数据定义的是…

基于51单片机的红外防盗及万年历仿真

目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体功能&#xff1a; &#xff08;1&#xff09;实时显示年、月、日、时、分、秒、星期信息&#xff1b; &#xff08;2&#xff09;红外传感器&#xff08;仿真中用按键模拟&#xff09;检测是否有…

【飞腾AI加固服务器】全国产化飞腾+昇腾310+PCIe Switch的AI大模型服务器解决方案

以下是全国产化飞腾AI加固服务器采用飞腾昇腾PCIe Switch解决方案&#xff1a; &#x1f5a5;️ 一、硬件架构亮点 ‌国产算力双擎‌ ‌飞腾处理器‌&#xff1a;搭载飞腾FT2000/64核服务器级CPU&#xff08;主频1.8-2.2GHz&#xff09;&#xff0c;支持高并发任务与复杂计算&a…

应用层协议:HTTPS

目录 HTTPS&#xff1a;超文本传输安全协议 1、概念 2、通信过程及关键技术 2.1 通信过程 1> TLS握手协商&#xff08;建立安全通道&#xff09; 2> 加密数据传输 2.2 关键技术 1> 对称加密算法 2> 非对称加密 3> 对称加密和非对称加密组合 4> 数…

【ArcGIS技巧】—村庄规划规划用地规划状态字段生成工具

"国土空间规划后续也是走向数据治理&#xff0c;数据建库已经是涉及到城市规划、建筑、市政、农业、地理信息、测绘等等方方面面。不得不说以后数据库建设跟维护&#xff0c;是很多专业的必修课。小编就湖南省的村庄规划建库过程中规划用地用海中规划状态字段写了个小工具…