当前位置: 首页 > news >正文

Linux文件系统-从“物理盘片”到“逻辑结构”:文件系统如何为硬盘注入灵魂?

                                                              

                        🔥海棠蚀omo:个人主页

                        ❄️个人专栏:《初识数据结构》,《C++:从入门到实践》,《Linux:从零基础到实践》

                        ✨追光的人,终会光芒万丈

博主简介:

目录

一.理解硬盘

1.1硬盘的物理结构

1.2磁盘的存储结构

1.2.1如何在一块磁盘中定位一个扇区?

1.3磁盘的逻辑结构

1.3.1理解过程

1.3.2真实过程

1.4CHS && LBA地址

二.引入文件系统

2.1引入" 块概念 "

2.2引入" 分区 "的概念

从最初讲解文件到现在,我们谈论的都是已经打开的文件,而我们今天就要谈论文件的另一种状态:未打开的文件!!!

我们在最初提到文件时,说到文件分为打开的文件和未打开的文件,而未打开的文件我们当时说它们在硬盘中,那么既然我们要讲解未打开的文件,就有必要先了解一下硬盘的相关知识,这样我们才能更好的去理解何为文件系统。

一.理解硬盘

1.1硬盘的物理结构

我们通过上图来观察硬盘的基本结构,硬盘中大概就分为上图的五部分:主轴,磁盘,磁头,磁头臂,永磁铁,我们后面的重点主要聚焦于磁盘和磁头,剩下的我们了解一下即可,主要是它们也没什么可讲的。

对于主轴而言,我们可以看到后面跟了马达二字,所以它是会旋转的,并且会带动磁盘一块旋转,不同的磁盘旋转速度也是不一样的,一般的可能就7200转,好一点能达到10000转,甚至12000转。

磁盘后面写的是相当于纸,什么意思呢?

也就是我们未打开文件的属性和数据都保存在盘面上,并且磁盘不是只有一面,它是有两面的,两面都是有数据的。

磁头,它后面写的是相当于笔,笔和纸的关系我们想必都清楚,所以操作系统要访问磁盘中的数据就要借助磁头,这个磁头是能够左右摆动的,就是为了能够找到相应的数据。

但磁头并不会与盘面直接接触,而是停留在它上方一段距离。

而磁头就被固定在磁头臂上,而磁头臂又在永磁铁上,这两个就没什么介绍的了,就是硬盘中的两种硬件。

1.2磁盘的存储结构

我们的重点还是磁盘和磁头,那么下面我们来具体看一下磁盘的平面结构:

上图就是将磁盘的平面结构中含有的内容给画了出来。

我们先看第一幅图:在整个盘面上,有着很多的同心圆,这些同心圆叫做磁道,我们感觉整个盘面是光滑的,但其实上面有很多的磁道,我们文件的数据就保存在这些磁道上,而我们也可以看到磁道与磁道之间有空白的部分,这些空白的部分是不存储数据的

再看第二幅图:这是把每个磁道给具体画了出来,我们也可以看到磁道也并不是一个完整的圆,它中间也是有间隙的,这些间隙间的就空白部分和上面一样是不存储数据的,而剩下的一个个小片段我们称为扇区,也就是与其说数据保存在磁道上,不如说数据都保存在这一个个的扇区中

扇区是磁盘存储数据的基本单位,大小一般为512个字节!!!

但磁道和扇区其实都是有宽度的,不是像我们上图所展示的那么细,我们来看下面的图:

将磁道和扇区都画粗我们看的就更直观了,扇区之所以叫做扇区,就是因为它的形状很像一把展开的扇子。

那么我问大家一个问题:一个盘面中的每个磁道的扇区数一样吗?

想必大家可能都会认为数量是不一样的,其实这个答案是不严谨的,对于大部分的磁盘来说,每个磁道的扇区数是一样的,也就是每个磁道中扇区间的疏密程度不同,当然现在随着科技的进步,也确实出现了每个磁道的扇区数不同,更外围磁道的扇区数会更多的磁盘。

但其实一个磁盘中并不只有一个盘面,而是有多个盘面的:

上面就显示了磁盘中的立体结构,在磁盘中一般是由多个盘面的,同时也就会有多个磁头,磁头和盘面是一对一的关系,一个面一个磁头

并且这些磁头是共进退的,什么意思呢?

意思就是一个磁头停留在了盘面的某个位置上面,那么剩下的所有磁头都会停留在同样的位置。

至于为什么要这样设计,我用一句话来概括:为了在成本、复杂度和可靠性之间取得最佳平衡。我们不必深究这句话什么意思,这都是前人经过实践才设计成这样的。

注意:共进退并不意味着同时工作!!!

虽然所有磁头都在同一位置,但并不意味着它们要同时工作,该谁工作谁工作,不要弄混了。

而从上面我们也看到了,盘片和盘面都是从0开始计数的,但是扇区却是从1开始计数的,这点在后面是有用的。

而有了这样的立体结构就要引出柱面这个知识点,那什么叫做柱面呢?

我们看上图,所有盘面的相同位置的磁道,或者说相同半径的磁道,是不是可以构成一个虚拟的圆柱体?

而这个圆柱体的侧面不正是所有相同半径的磁道组成的吗?柱面其实就是磁道,我们要把所有相同半径的磁道看作一个整体。

至于柱面有什么用呢?我们下面讲到的时候就知道了。

1.2.1如何在一块磁盘中定位一个扇区?

下面我们就来思考一下如何定位一个扇区的问题,我们在上面介绍磁头时说了磁头可以左右摆动来找到我们要访问的数据,也就是找到一个扇区:

也就是如上图所示,而磁头左右摆动的本质就是定位哪一个磁道,但是通过左右摆动我们只能找到一个磁道,那要如何定位一个扇区呢?

这就是盘片旋转的本质了,盘片旋转的本质就是在确定了哪一个磁道的前提下,定位该磁道的某一个扇区

磁头刚移到某个磁道上的时候不一定就能找到我们想要找的扇区,但是很快盘面就会将我们要找的扇区给转过来 。

而通过上面的操作我们就能精准找到每一个扇区,我们把上面的操作给总结下来:

1.确定磁头要访问哪⼀个柱⾯(磁道)(cylinder)
2.进而定位磁头(header)
3.最后定位⼀个扇区(sector)
而这上面的三部操作也有一个专业名称,叫做:CHS地址定位,名字就由它们各自的首字母组成,那么能定位一个扇区,能定位多个扇区吗?
 
答案当然可以,既然能定位一个扇区,那就能定位多个扇区,我们来看:
我们可以把磁盘那想象成一个小黑盒,我们想要定位哪个扇区,将对应的C,H,S数据传给磁盘,磁盘根据传入的数据找到相应的数据再给传出来,这样就能完成访问磁盘数据的目的。

1.3磁盘的逻辑结构

1.3.1理解过程

我们上面讲了扇区和磁道在盘面上,那我们来思考一个问题:在硬件方面,扇区和磁道在盘面上,那在逻辑方面,磁盘是具体是如何规划扇区和磁道的呢?

要解决这个问题我们先来看点别的:

我们小时候应该都见过上面的东西,这东西加什么呢?

没错,就是磁带,磁带在盒子中是一圈一圈缠在里面的两个齿轮上的,用的时候两个齿轮会转动,那么这个磁带我们上面要讲的内容有什么关系呢?

我们想象一下:一圈一圈缠在齿轮上的磁带是否很像我们上面的各个磁道?

一圈就是一个磁道嘛,那想必我们小时候应该都干过将里面的磁带给拽出来的事吧,我就这样干过,拽出来的磁带就是一个长条,那我们如果把一个盘面上的磁道给" 拽 "出来,是不是一个盘面上的磁道就可以看成是线性结构了呢?

而这个盘面上的扇区和磁道我们是不是就可以看成这样呢?

那进一步一个盘面我们不就可以将其看成一个一维数组吗?那我们定位扇区的过程不就是遍历一个数组吗?

这样每个扇区不就有了一个线性地址,也就是数组下标嘛,我们通过数组下标就可以很快的定位一个扇区了,那这个线性地址或者说数组下标叫什么呢?

叫做LBA(Logic Block Address),通过LBA地址我们就可以定位任意一个扇区,但是磁盘并不能看懂LBA,它只能看懂CHS,所以我们要做的就是完成LBA和CHS的转化,那要怎么做呢?

很简单,举个例子:现在一个盘面有10个磁道,而一个磁道中有10个扇区,也就是一个盘面就是100个扇区,现在给你一个LBA地址为123,让你得出CHS的数据。我们来看:

既然是数组下标,那我们就可以通过简单的数学计算来得到相应的CHS,对上面的例子而言我们要找的扇区不就是在1号盘面,2号磁带,3号扇区的位置吗?

既然LBA可以转化为CHS,那么CHS当然也可以转化为LBA,将上面的计算反过来就可以了。

也就是对于LBA和CHS而言,它们之间是可以相互转化的!!!

而有了LBA后,我们再次看上面的小黑盒比喻,就可以将CHS换成LBA地址了。

1.3.2真实过程

但是上面的过程并不是真实的磁盘中规划扇区和磁道的过程,上面我们是以一面为单位进行展开的,但实际上磁盘真实的展开并不是以物理盘面展开的,上面的介绍是为了让我们可以将磁盘的结构看成一个数组,事实上磁盘的展开是以柱面为单位展开的!!!

以柱面为单位展开是什么意思呢?

有了上面的理解过程的认识,我们可以把一个磁道也堪称一个小的一维数组,也就是:

而柱面是由磁道构成的,那么我们把一个柱面展开来看:

那么一个柱面展开后不就是一个二维数组吗?

但是根据半径的不同一个磁盘有多个柱面,我们不就可以这样看待一个磁盘一个磁盘的展开:

此时的磁盘,我们不就可以看成是一个三维数组了嘛,数组的第一个下标代表的就是柱面(磁道),第二个下标就表示磁头(选择哪一个磁道),第三个下标就表示扇区

并且对应的CHS的顺序也是一样的,这就是为什么我们在上面写CHS地址定位的时候第一步的定位磁道要写成柱面,并且我们为什么要介绍柱面的原因。

虽然上面的理解过程只是让我们能够把磁盘看作成数组,但是我们来思考一个问题:我们可以把三维数组看成一个" 一维数组 "吗?

当然可以,而将三维数组看成一维数组的方式就是这样:

我们把不同的柱面拼接在一起不就行了吗?

按照上面的方式我们就可以将一个三维数组看作是一维数组,三维数组我们可能不太熟悉,但是一维数组我们可太熟悉了,所以我们今天就可以认为磁盘就是一个以扇区为单位的一维数组!!!

既然是一维数组,那么操作系统就不需要传CHS地址给磁盘,只需要传LBA地址即可,那么将LBA地址转化成CHS地址的工作由谁来做呢?

答案由磁盘自己来做,具体来说是由磁盘中的硬件电路,伺服系统等来完成这个工作。

1.4CHS && LBA地址

最后我们来总结一下CHS和LBA两种地址之间的转化方式,这里注意和上面的认识过程的转化区分开来,上面的认识过程并不是真实过程,这里我们是按照真实过程来进行转化的!!!

CHS转成LBA:
1.磁头数*每磁道扇区数 = 单个柱⾯的扇区总数
2.LBA = 柱⾯号C*单个柱⾯的扇区总数 + 磁头号H*每磁道扇区数 + 扇区号S - 1
即:LBA = 柱⾯号C*(磁头数*每磁道扇区数) + 磁头号H*每磁道扇区数 + 扇区号S - 1
3.扇区号通常是从1开始的,⽽在LBA中,地址是从0开始的
4.柱⾯和磁道都是从0开始编号的
5.总柱⾯,磁道个数,扇区总数等信息,在磁盘内部会⾃动维护,上层开机的时候,会获取到这些参数。
LBA转成CHS:
1.柱⾯号C = LBA // (磁头数*每磁道扇区数)【就是单个柱⾯的扇区总数】
2.磁头号H = (LBA % (磁头数*每磁道扇区数)) // 每磁道扇区数
3.扇区号S = (LBA % 每磁道扇区数) + 1
"//": 表⽰除取整
这里解释一下为什么计算扇区号的时候+1:因为扇区号是从1开始计数的,而我们的LBA地址是数组下标,是从0开始计数的,所以+1才是正确的扇区所在的位置

二.引入文件系统

2.1引入" 块概念 "

其实硬盘是典型的“块”设备,操作系统读取硬盘数据的时候,其实是不会⼀个个扇区地读取,这样
效率太低,⽽是⼀次性连续读取多个扇区,即⼀次性读取⼀个”块”(block)
硬盘的每个分区是被划分为⼀个个的”块”。⼀个”块”的⼤⼩是由格式化的时候确定的,并且不可
以更改,最常⻅的是4KB,也就是4096个字节,即连续⼋个扇区组成⼀个 ”块”。”块”是⽂件存取的最⼩单位
每个扇区都有LBA,那么8个扇区⼀个块,每⼀个块的地址我们也能算出来,知道LBA:块号 = LBA/8,知道块号:LBA=块号*8 + n. (n是块内第⼏个扇区)
用图来演示整个过程就如上面所示,而通过块的方式磁盘就可以由管理好每一个扇区转变为管理好每一个块了

2.2引入" 分区 "的概念

但是只是分成" 块 "的话,还是太多了,就比如:你的硬盘有800GB,这对于现在我们的电脑来说并不算很多,一般都是1T甚至更多,我们来计算一下这800GB有多少个块:

上面计算的是800GB总共是多少字节,下面我们来计算一下有多少个块:

上面就是800GB的硬盘含有的块的数目,只是800GB都有2亿多个块,这么多块还是不太好管理,所以磁盘又引入了分区的概念,什么意思呢?我们下面来看:

我们可以将这800GB分为不同的区,就和我们windows电脑上的C盘,D盘,E盘等是一样的道理,我们将磁盘划分成不同的区后,就可以由管理好每一个块转为管理好每一个区,区的个数相比块的数目就少了很多,我们能管理好一个区就能管理好其他的区。

结构就如上图所示,每个区中都有不同数量的块,而我们就可以通过起始块的地址终止块的地址来确定一个区的范围:

以上就是从“物理盘片”到“逻辑结构”:文件系统如何为硬盘注入灵魂?的全部内容。

http://www.dtcms.com/a/573265.html

相关文章:

  • 硬件 - CadenceAllegro入门使用常见问题
  • 2025 实战指南:WebAssembly 重塑云原生开发 —— 从前端加速到后端革命的全栈落地
  • 商务网站开发建设工程合同分类有哪些
  • 【XR技术介绍】空间音频(Spatial Audio):原理是什么?如何让声音听起来像是从你身后传来的?
  • 海思 SLE 芯片 Linux 烧录
  • 《C++ STL哈希容器全解析:哈希拓展位图以及布隆过滤等高阶应用》
  • IOC 注解方式详解
  • LangFlow源码深度解析:Agent核心机制与工具化设计
  • gomobile build 成apk 遇到的几个问题
  • 化妆品购物网站开发的意义广州网络公司网络推广
  • 稳定的网站服务器租用七牛云存储 wordpress插件
  • 【SAA】SpringAI Alibaba学习笔记(一):SSE与WS的区别以及如何注入多个AI模型
  • 基于企业级建模平台Enterprise Architect的云地融合架构设计
  • 乡镇网站建设内容规划乐山网站制作设计公司
  • 【笔记】解决 “AssertionError: Torch not compiled with CUDA enabled“ 错误
  • 八股训练营第 7 天 | TCP连接如何确保可靠性?拥塞控制是怎么实现的?TCP流量控制是怎么实现的?UDP怎么实现可靠传输?
  • 清除BSS段(ZI段)
  • 数据库安全配置指导
  • 江苏南京建设局官方网站wordpress开发门户网站
  • 科学休息,我用AI写了个vscode养鱼插件:DevFish发布
  • Spring Boot 项目 GitLab CI/CD 自动构建并推送到 Harbor 教程
  • 彻底理解传统卷积,深度可分离卷积
  • 使用VSCode进行SSH远程连接时无法与xxx建立连接
  • 宁波建设工程报名网站陕西省住房与建设厅网站
  • Rust 练习册 6:生命周期与闭包
  • 公司网站开发的流程高端企业网站公司
  • 第二届中欧科学家论坛暨第七届人工智能与先进制造国际会议(AIAM 2025)在德国海德堡成功举办
  • 微硕WSF3085 MOSFET,汽车电动尾门升降强效驱动
  • 5 Prompt Engineering 高阶技巧:构建智能对话系统的核心技术
  • 汽车系统可靠性与技术融合:智能动力总成及机电一体化诊断