目录

一、共识原理

二、认识理解硬件——磁盘(物理结构)

三、磁盘的存储构成

四、磁盘的逻辑结构

CHS && LBA地址转换关系

CHS转成LBA:

LBA转成CHS:

五、回归到硬件


一、共识原理

通过之前的学习我们知道,文件分为打开的文件和没有被打开的文件,打开的文件通常是内存级的文件,没打开的文件则是磁盘上的文件,这篇文章我们主要讲解磁盘上未被打开的文件

如果文件没有被打开呢?我们已经知道没有被打开的文件是在磁盘上进行存储,那么我们又该如何研究磁盘上没有被打开的文件呢?通过如下四点

  1. 路径问题
  2. 存储问题
  3. 获取问题(文件属性+文件内容)
  4. 效率问题

从本质上说,文件由文件属性和文件内容组成。因此,磁盘存储文件实际上就是存储这两部分信息

具体而言:

  • 文件属性存储在inode中
  • 文件内容存储在数据块中 (关于inode和数据块的详细说明将在后续内容中展开)

由此可见,Linux系统中文件的磁盘存储采用的是属性与内容分离的存储方式。接下来,让我们深入了解磁盘的相关知识。

二、认识理解硬件——磁盘(物理结构)

在正式讲解磁盘前,我们先看一下光盘,大多数人都使用过光盘通过影碟机去放映电影电视剧等

上面是光盘的正反面示意图。光盘正面通常印有黑白或彩色图案来展示光盘的相关信息内容,但这并非我们关注的重点。真正重要的是光盘的反面,其光滑表面才是用于数据存储的部分。值得注意的是:

  1. 光盘通过影碟机播放影视内容
  2. 影碟机本身不具备数据存储功能
  3. 数据实际存储在光盘的反面
  4. 正面印刷的图案区域无法存储任何数据 换言之,只有光盘光滑的那一面才具有数据存储功能。

磁盘是计算机(仅考虑台式计算机,不考虑笔记本)外设(硬件)中唯一的一个机械设备,同时也是一个外设,磁盘是永久性存储介质,下面就是磁盘的一张图,即磁盘的物理结构

磁盘就是一块物理硬盘

磁盘是一种类似于光盘的存储介质,但两者在结构上存在差异。磁盘采用双面光滑设计,通常由三张盘片组成,每张盘片的两面都经过抛光处理,因此一个标准磁盘共有六个光滑表面。每个表面都配有一个独立的磁头,所以总共需要六个磁头进行数据读写。

与内存相比,磁盘具有明显的价格优势和更大的存储容量,但同时也存在读写速度较慢的缺点。在磁盘结构中,盘片中心设有主轴,下方安装马达驱动装置。当主轴和马达运转时,所有盘片会同步进行顺时针或逆时针旋转(本文假设为顺时针方向)。磁头通过磁力臂悬浮在盘片上方,由磁力臂控制其左右移动(六个磁头同步运动)。

值得注意的是,虽然盘片表面看起来十分光滑,但在放大镜下观察时,实际能看到大量密集的微小突起结构。这些微观结构对数据存储起着关键作用。

这些小突起实际上是磁性物质。既然磁盘与磁力相关,而计算机底层只识别二进制序列,且磁盘作为计算机外设需要实现数据输入输出,那么它必须能够表征二进制序列。我们知道磁铁具有南北极(S/N极),因此可以通过设定盘片磁性物质的上表面初始状态:全部为北极N表示二进制0,需要时则通过磁头的电磁作用将其改为南极S表示二进制1。这样,磁盘就能通过改变磁性物质的极性来存储二进制数据。

为确保数据安全,必须避免磁头与盘片接触。台式机因配备机械硬盘而不宜频繁移动——在移动或碰撞时,磁头的左右移动与盘片的旋转可能在惯性作用下产生接触,导致磁性物质被意外改变,进而造成数据丢失。相比之下,笔记本通常采用SSD固态硬盘,没有机械部件,抗震性能更好,使用寿命也更长。

值得注意的是,机械硬盘在反复修改文件时需要磁头不断改变盘片磁性,当改写次数达到极限就会失效。不过理论上其使用寿命可达3万小时(约5-10年),因此无需过度担忧。

由于磁盘价格低廉且容量大,企业机房通常采用磁盘阵列存储海量数据。这些磁盘会持续运行直至达到使用年限或出现故障。淘汰的磁盘必须进行专业销毁——不能简单转卖,因为可能泄露用户数据。通常采用厂家提供的专业擦除技术来确保数据安全。

三、磁盘的存储构成

下面我们具体探索一下磁盘的存储构成

如上图所示,磁盘盘片由同心圆状的磁道组成。当多个盘面上半径相同的磁道在立体空间中形成柱面时,每个磁道又被划分为若干扇区标准扇区大小为512字节或4KB,本文以512字节为例进行讨论。因此,扇区是磁盘访问的最小单元

      

柱面 : 每一面上相同半径的磁道逻辑上构成柱面 , 并且柱面上每个磁道的扇区个数是一样的 , 所以柱面数量上等于磁道数量 , 在第几个磁道上就等于在第几个柱面上 , 我们就可以理解为磁盘整体是由多个柱面构成的

所以我们可以将磁盘视为由无数扇区组成的存储介质。要存储数据,首先需要定位目标扇区,这一过程分为三个步骤:

  1. 确定盘面位置(通过选择对应的磁头)
  2. 确定磁道位置(即确定柱面位置)
  3. 确定扇区位置

这种定位方法称为CHS寻址:

  1. C(Cylinder):柱面(选择哪一磁道)
  2. H(Heads):磁头(选择哪一面)
  3. S(Sector):扇区

结合磁盘物理结构来看:

  • 磁头左右移动用于定位磁道/柱面
  • 选择特定磁头用于定位盘面
  • 盘片旋转用于定位扇区

这三个机械运动的组合就实现了CHS寻址方式。

此时我们对磁盘机械运动有了新的认识:数据存取时,磁头定位扇区的机械运动次数直接影响效率。运动越频繁,效率越低;反之则越高。因此,软件设计中通常会刻意将关联数据存储在相邻区域。这是因为当读取某个数据后,紧接着访问其关联数据的概率很高,比如按索引顺序连续访问的情况。

四、磁盘的逻辑结构

在认识磁盘的逻辑结构前,先介绍一下盒式磁带:

将盒式磁带放入录音机播放时,磁带会从一个卷轴转移到另一个卷轴。磁带表面存储着音频数据,录音机通过读取这些数据来播放声音。播放完毕后如需重复收听,需要将磁带反面放入进行倒带操作。

实际上,磁带中的数据存储并不依赖于卷轴结构。我们可以将磁带完全展开成直线,录音机依然能通过读取磁带上的磁信号来播放声音。这种展开状态更直观地展示了数据的线性存储方式。

通过这个类比,我想说明的是:数据存储介质(如磁带)可以以展开的线性形式存在,其上存储的信息同样能被读取设备识别和处理。

回归到磁盘结构上。以上图为例,磁盘的盘片由多个同心圆磁道组成每个盘面(一个盘片有上下两个盘面)可以视为无数个半径不同的环形磁道。类比盒式磁带的原理:正如磁带可以拉直展开,我们同样可以将盘面上的环形磁道抽象为一条直线。这样,三个盘片共六个盘面的磁道就能拼接成一条更长的直线。

如前所述,磁盘是由无数扇区组成的存储介质,多个扇区构成一个磁道。既然盘面磁道已被抽象为直线,我们可以进一步细分:按照扇区组成磁道的方式,将这条直线划分为最基本的512字节扇区单元。此时在逻辑层面,磁盘就呈现为一个基于扇区的线性数组结构。

 

  每个扇区就像等于是一个三维数组的下标

                                                                       柱面(磁道) ---> 盘面(磁头) ---> 扇区(数组下标)

此时在逻辑层面,磁盘就呈现为一个基于扇区的线性数组结构。所以,每一个扇区都有一个下标,我们叫做LBA(Logical Block Address)地址,其实就是线性地址

通过这种抽象方法,我们就可以这个三维数组逻辑转化为一个一维数组 , 磁盘的物理结构就可以展开为线性逻辑结构(如下图示)。基于这种逻辑视图,我们能够通过计算实现逻辑扇区地址(LBA)到物理地址(CHS)的转换。

上图是磁盘LBA地址与CHS物理地址的转换讲解,核心是把磁盘的逻辑扇区地址(LBA)转成实际的物理CHS地址(磁道C、磁头H、扇区S)

  • 磁盘LBA地址与CHS物理地址的转换,核心是将逻辑扇区地址(LBA)对应到实际物理地址(磁道C、磁头H、扇区S),其基础设定为总扇区120000个、分6个盘面(对应6个磁头,盘面号=磁头号且从0开始),单个盘面扇区数20000个(120000÷6)、磁道数400个,单个磁道扇区数50个(20000÷400);转换逻辑以LBA=43999为例,先通过LBA除以单盘面扇区数取商得到磁头号H=2(43999÷20000=2),再用LBA除以单盘面扇区数取余数得到该盘面内剩余扇区3999(43999%20000=3999),接着用盘面内剩余扇区除以单磁道扇区数取商得到磁道号C=79(3999÷50=79),最后用盘面内剩余扇区除以单磁道扇区数取余数再加1(扇区从1开始)得到扇区号S=49(3999%50=49),最终LBA=43999对应的CHS为C=79磁道、H=2磁头、S=49扇区;反向验证可通过公式LBA=磁头号×单盘面扇区数+磁道号×单磁道扇区数+扇区号,代入CHS(2、79、49)计算得2×20000+79×50+49=43999,与原LBA一致,整体就是将磁盘逻辑编号对应到实际物理位置(盘面、磁道、扇区)的方法。

CHS && LBA地址转换关系

CHS转成LBA:

  1. 磁头数*每磁道扇区数 = 单个柱面的扇区总数
  2. LBA = 柱面号C单个柱面的扇区总数 + 磁头号H每磁道扇区数 + 扇区号S - 1
  3. 即:LBA = 柱面号C*(磁头数每磁道扇区数) + 磁头号H每磁道扇区数 + 扇区号S - 1
  4. 扇区号通常是从1开始的,而在LBA中,地址是从0开始的
  5. 柱面,磁道,扇区都是从0开始编号的
  6. 总柱面,磁道个数,扇区总数等信息,在磁盘内部会自动维护,上层开机的时候,会获取到这些参数。

LBA转成CHS:

  1. 柱面号C = LBA // (磁头数*每磁道扇区数)【就是单个柱面的扇区总数】
  2. 磁头号H = (LBA % (磁头数*每磁道扇区数)) // 每磁道扇区数
  3. 扇区号S = (LBA % 每磁道扇区数) + 1
  4. "//":表示取整

所以:从此以后,在磁盘使用者看来,根本就不关心CHS地址,而是直接使用LBA地址,磁盘内部自己转换。磁盘就是一个元素为扇区的一维数组,数组的下标就是每一个扇区的LBA地址。OS使用磁盘,就可以用一个数字访问磁盘扇区了。

五、回归到硬件

其实不仅仅CPU有寄存器,其它设备(外设也有),磁盘也有,例如控制寄存器,数据寄存器,地址寄存器,状态寄存器等

当CPU或操作系统需要与磁盘交互时,首先会向磁盘发送控制指令。例如执行写入操作(w)时,系统会将内存中待写入数据的起始地址存入磁盘的数据寄存器,同时将逻辑扇区地址(LBA)存入地址寄存器。磁盘获取LBA地址后,会通过转换算法将其转换为CHS地址(柱面-磁头-扇区地址),从而精确定位目标扇区位置。在数据写入过程中,磁盘的状态寄存器会显示"未就绪"状态。操作系统通过持续检测状态寄存器,发现该状态后会使当前进程进入阻塞等待状态。当磁盘完成数据写入后,状态寄存器会变为"就绪"状态。操作系统检测到这一变化后,会唤醒处于阻塞状态的进程,使其恢复运行状态。至此,数据成功写入到由LBA转换后的CHS地址所对应的磁盘扇区中。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐