Re:Linux系统篇(三十二)文件篇·五:Ext文件系统前奏 - 存储底层从物理拆解到 LBA 地址转换


◆ 博主名称: 小此方-CSDN博客 大家好,欢迎来到小此方的博客。
⭐️Linux系列个人专栏: 【主题曲】Linux
⭐️此方的GitHub: github_此方
⭐️ Re系列专栏:我们思考 (Rethink) · 我们重建 (Rebuild) · 我们记录 (Record)


文章目录


概要&序论

  Hello大家好,我是此方 。本文深入解析硬盘物理及逻辑架构,揭示数据读写底层机制,为下一篇的文件系统做准备。

  • 物理结构:拆解盘片、扇区、磁头及柱面组成;
  • 寻址原理:详解 CHS 寻址方式与逻辑结构映射;
  • LBA 映射:明确逻辑块地址(LBA)与 CHS 互转的数学逻辑。

  直接进入正题。

一、扫盲:以防你不知道各种硬件是什么

  这是磁盘

  这是磁盘内部

  这是服务器

  服务器的每一个槽位都可以拔出来,一个就是一块盘,一个盘4TB,这个服务器一共24*4TB容量。

  这是机柜,上面插满了服务器.

  这么多的机柜组成机房,机房是只有大公司用的起的。

二、认识磁盘的物理结构

2.1磁盘的特点

  • 机械磁盘是计算机中唯一的一个机械设备(外设)
  • 容量大,价格便宜(相对来说
  • 如何破坏一个磁盘?高温退磁,磁盘的盖子不能打开,内部是真空的,打开基本上磁盘就废掉了。
  • 区分你的桌面盘和企业的企业盘1.磁盘转动速度2.磁头移动速度3.一次定位的精度

2.2磁盘片、扇区

  我们的磁盘面相当于纸,磁头相当于笔。磁盘可以理解为由无数的被打磨的非常光滑的小磁铁组成的,磁盘内容的修改就是修改小磁铁的南北极 (0/1)

  我们拿出这么一块磁盘片的一面,上面一圈一圈的就是磁道,我们拿出每一个磁道,上面一个一个间隙分割出来的就是一个一个扇区。

  什么是扇区?如下图,这么一小块就是一个扇区。

2.3盘面、磁头、柱面

  一个磁盘不止是一块盘片,一般常见的磁盘有三片盘片左右,每一个盘片的正反两面都可以存储数据。

  对应的,3个盘片六个盘面就代表有6个磁头来执行写入操作。

  每一个磁头都被磁臂带着走,对,就是"共进退 ",而不是各走各的(否则这对机械结构复杂度要求将会指数级上升)。

  既然磁头是共进退的,那么我们可以结合磁道引出一个虚拟的概念:柱面。

  看图,在任何时候,每一个磁头都在不同的磁面同一个磁道上同一个位置。那么把所有的磁道全部连起来,就会形成一个垂直的柱面。

2.4总结以上组件

  • 磁头(head)数:每个盘片一般有上下两面,分别对应1个磁头,共2个磁头
  • 磁道(track)数:磁道是从盘片外圈往内圈编号0磁道,1磁道...,靠近主轴的同心圆用于停靠磁头,不存储数据
  • 柱面(cylinder)数:磁道构成柱面,数量上等同于磁道个数
  • 扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同
  • 圆盘(platter)数:就是盘片的数量
  • 磁盘容量=磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数

三、磁盘是怎么读写数据的

  磁盘上的数据是以扇区为单位存储的,每一个扇区存储的数据都是512字节。

  哎呀不兑吧,外围的扇区和内围的扇区大小不一致呀?确实,所以外围扇区和内围扇区是信息密度也不一致。

  当然现代也有技术让外围扇区空间利用率能更大一些,但是那种磁盘我们不讲。(这种技术叫ZBR,但是本文硬件不讲太深

3.1CHS寻址方式

  柱面(cylinder),磁头(head),扇区(sector) ,显然可以定位数据了,这就是数据定位(寻址 )方式之一,CHS寻址方式。

  • 寻柱面(Cylinder): 驱动磁臂在径向移动,将磁头定位至目标磁道位置。
  • 寻磁头(Head): 确定访问哪一个盘面,通过电子切换激活目标磁头。
  • 寻扇区(Sector): 等待盘片旋转,直至目标扇区到达磁头下方完成读写。

  磁盘写入数据的时候是6个磁头轮流写,把比如1GB的数据全部写入到一个柱面中,这个柱面在三片磁盘中的磁道位置相同。

  软件层的对文件的存储就是将文件存储在一个或者是多个扇区里面然后记住这个扇区的CHS三个地址。

3.2磁盘的逻辑结构

3.2.1类比磁带理解线性结构

  我们读写一个磁盘的一个比特位 ,就需要把这一个扇区加载到内存,修改完再读取回来。

  磁盘的读取速度太慢了,所以不能简单的以一个字节来读取,必须一次读取一个扇区至少。

  你小学玩过磁带吗?比如把磁带抽出来,从村东头拉到村西头,此方小时候这么干过。

  这个磁带,这么一长条你给他拉直,形成一个线性结构

  那么磁盘本质上虽然是硬质的,但是逻辑上我们可以把磁盘想象成为卷在一起的磁带 ,那么磁盘的逻辑存储结构我们也可以类似于:

  这样每一个扇区,就有了---个线性地址(其实就是数组下标),这种地址叫做 LBA。

3.2.2整个磁盘就是一个三维数组

  好,能理解我们就开始深入讲解,这么一个磁盘,我们拿出其中一个磁面的一个磁道:

  啪,我们把它铺开,就是一个一维数组 ,单位是一个扇区。

  好,相同的磁道,现在我们要把所有的盘面都请过来,这整个柱面上所有的磁道全部一样的,啪,展开。

  这就变成了一个二维数组。

  这一个盘面上所有的柱面全部叠加在一起,就形成了磁盘,也就是说,磁盘是一个三维数组(如果从逻辑上来看的话)

  所以回到CHS寻址原理,你就会惊奇的发现!CSH的三步,就是寻找这个三维数组的三个下标!

  从这里开始我们下面要讲两个难点LBA地址和文件系统。

3.3LBA地址

  还记得我们学C的时候如何看待二维数组?它在内存层面也是一个一位数组,那么三维数组其实内存层面也是一个一维数组。如下,我们把3.2.2的这张图铺成一条线:

  这整条线是一个磁盘,我们分成一个个柱面,每一个柱面分成一个个的磁道,每一个磁道又分成一个个的扇区,扇区是最小单位。

  所以每一个扇区都对应一个下标,这个下标,就是LBA(Logical Block Address)地址。(操作系统对磁盘的管理就变成了对一维数组的管理)

3.3.1CHS 转 LBA公式

  CHS和LBA的互转,本质上是一维数组的下标和三维数组的下标的互相转化。

看公式前须知:

磁头数==扇面数==单个柱面的磁道数量

柱面号:在磁盘角度从外向内递增。在LBA地址角度从小到大递增。

  • 磁头数 * 每磁道扇区数 = 单个柱面的扇区总数
  • L B A = 柱面号 C × 单个柱面的扇区总数 + 磁头号 H × 每磁道扇区数 + 扇区号 S − 1 LBA = 柱面号 C \times 单个柱面的扇区总数 + 磁头号 H \times 每磁道扇区数 + 扇区号 S - 1 LBA=柱面号C×单个柱面的扇区总数+磁头号H×每磁道扇区数+扇区号S−1

怎么理解?一句话:计算你前面有多少个完整的柱面+前面又多少个完整的磁道+当前柱面当前磁道零碎的扇区。- 你自身。

  • 即: L B A = 柱面号 C × ( 磁头数 × 每磁道扇区数 ) + 磁头号 H × 每磁道扇区数 + 扇区号 S − 1 LBA = 柱面号 C \times (磁头数 \times 每磁道扇区数) + 磁头号 H \times 每磁道扇区数 + 扇区号 S - 1 LBA=柱面号C×(磁头数×每磁道扇区数)+磁头号H×每磁道扇区数+扇区号S−1
  • 扇区号通常是从 1 开始的,而在 LBA 中,地址是从 0 开始的
  • 柱面和磁道都是从 0 开始编号的
  • 总柱面、磁道个数、扇区总数等信息,在磁盘内部会自动维护,上层开机的时候,会获取到这些参数。

3.3.2LBA 转 CHS公式

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

  怎么理解?

  扇区号不画图了,就是上面的图最后剩下的那一小段。

  因为我们的LBA地址和CHS地址有如上的公式可以相互转化 ,于是OS内部只需要管LBA地址就可以了,操作系统需要告诉磁盘三个信息:LBA地址+数据+读/写,所以磁盘就可以执行操作了

  更准确的说,操作系统不需要知道LBA地址,操作系统需要知道两个量:LBA起始位置常量+偏移量。


有了以上的理解,是时候引出文件系统了,我们下一篇再见