这是一篇为文件系统铺路的前置文章。我们要把硬盘的物理与逻辑架构扒开,看清数据在盘片上到底怎么被读写、怎么被定位。不讲玄的,直接上硬货:
-
物理结构:拆开硬盘外壳,盘片、扇区、磁头、柱面,一个都跑不了;
-
寻址原理:CHS这老古董怎么定位数据,又怎么映射成逻辑结构;
-
LBA映射:逻辑块地址(LBA)和CHS之间怎么换算,背后是哪套数学逻辑。
话不多说,我们直接进正题。
目录
[2.1 磁盘的基本特点](#2.1 磁盘的基本特点)
[2.2 磁盘片与扇区](#2.2 磁盘片与扇区)
[2.3 盘面、磁头与柱面](#2.3 盘面、磁头与柱面)
[2.4 磁盘物理组件总结](#2.4 磁盘物理组件总结)
[3.1 CHS寻址方式](#3.1 CHS寻址方式)
[3.2 磁盘的逻辑结构](#3.2 磁盘的逻辑结构)
[3.2.1 从磁带理解数据的线性存储](#3.2.1 从磁带理解数据的线性存储)
[3.2.2 把磁盘理解成一个三维数组](#3.2.2 把磁盘理解成一个三维数组)
[3.3 LBA逻辑块寻址](#3.3 LBA逻辑块寻址)
[3.3.1 CHS转换为LBA](#3.3.1 CHS转换为LBA)
[3.3.2 LBA转换为CHS](#3.3.2 LBA转换为CHS)
一、认识磁盘与相关硬件
磁盘:

磁盘内部:

服务器:

服务器的硬盘,在物理层就是一块块可插拔的盘。
很多机架式服务器的前面板,都留着一排硬盘槽位。每个槽位里插一块盘,单盘容量4TB,满配24块,整机就是24 × 4TB。你抽出来一块,系统就少一块盘;插回去,它又重新上线。我们后面要讲的扇区、柱面、LBA,全都发生在这每一块4TB的铁盒子里。

机柜,上面插满了服务器:

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

二、认识磁盘的物理结构
2.1 磁盘的基本特点
机械硬盘,是计算机里少有的、真正带着机械运动部件的设备。相比内存、CPU那些纯电子的高速器件,它是个不折不扣的"老黄牛"。
-
慢:这是它最突出的标签。机械臂寻道、盘片旋转,都需要实打实的物理时间,跟内存读写差了不止一个数量级。
-
容量大,价格便宜:单位容量的成本,机械硬盘至今依然比固态硬盘低得多,适合用来做海量冷数据存储。
如何毁掉一块磁盘?
最有效的物理破坏手段之一,是高温退磁。机械硬盘靠盘片表面的磁性材料记录数据,温度一旦超过居里点,磁性就会消失,数据也就没了。至于拆盘,更是一条不归路,磁盘内部并不是真空,而是一个高度无尘的洁净空间(部分企业盘还会充入氦气)。盖子一打开,空气中的灰尘颗粒落进去,磁头飞行高度只有几纳米,一粒灰尘就能让磁头撞毁盘片,整块盘基本就废了。所以,开盖即报废。
桌面盘与企业盘,怎么区分?
同样是机械硬盘,桌面盘和企业盘的差距,主要看三个维度:
-
盘片转动速度:桌面盘常见5400转或7200转,企业盘通常上万转,甚至15000转,数据来得更快。
-
磁头移动速度:企业盘的磁头臂驱动更强,寻道时间更短,能在更短时间内定位到目标磁道。
-
一次定位的精度:企业盘对震动、温漂的补偿更到位,长时间高负载下更稳定,定位也更精准。
这三个指标,共同决定了企业盘在7×24小时高强度读写下依然能保持稳定,而桌面盘更适合日常非持续性的使用。

2.2 磁盘片与扇区
把磁盘面想象成一张纸,磁头就是那支笔。但这张"纸"有点特别,它由无数被打磨得极其光滑的微小磁铁组成。往磁盘里写数据,本质上就是给这些磁铁翻个方向:南极北极一调,0和1就区分开了。修改内容,就是重新排列这些小磁铁的南北极。

把磁盘片的一面摊开来看,上面那一圈一圈的同心圆,就是磁道 。磁道不是连着的,它被一段段小间隙切开,每一小段就是一个扇区。

那到底什么是扇区?看下面这张图,圈出来的那一小块,就是一个扇区。它是磁盘读写的最小单元,每次磁头读写数据,至少都是以一个扇区为基本单位来进行的。不管你想读1个字节还是512个字节,磁头都得把整个扇区"过"一遍。

一张磁盘的逻辑结构,从大到小可以这么排:盘片 → 磁道 → 扇区。盘片是一整张,磁道是一圈,扇区是圈上被切出来的最小格子。理解了这层,后面讲CHS寻址和LBA的时候,就有了落脚点。
2.3 盘面、磁头与柱面
一个磁盘通常不是单块盘片。常见的机械硬盘里,往往叠着三片左右的盘片。每片盘片正反两面都能存数据,一面算一个盘面,三片就是六个盘面,自然也配了六个磁头来读写。


有意思的是,这六个磁头并不是各走各的,它们被同一根磁臂固定在一起,共进退。你动我也动,六个头永远保持同样的位置关系。这么设计,是怕机械结构复杂到不可收拾,如果每个磁头单独控制,复杂度会指数级飙升。

既然磁头永远同步移动,我们再回头看磁道,就可以引出一个虚拟概念:柱面。
想象一下:任何一个瞬间,六个磁头分别停在六个盘面的同一条磁道上,而且位置完全对齐。把上下所有盘面上同一编号的磁道竖直连起来,就形成了一个柱面。数据在磁盘上的逻辑排布,又多了一层"柱面"的维度。
2.4 磁盘物理组件总结
把所有零部件摆到一起,再重新理一遍它们各自的数量和关系。
-
磁头数:每个盘片都有上下两个盘面,每个盘面对应一个磁头。所以一片盘片配两个磁头;如果装了三片盘片,那就是6个磁头。
-
磁道数:磁道从盘片最外圈开始编号,0磁道、1磁道、2磁道......一路往内圈排。最靠近主轴的那一小圈是磁头停靠区,不存数据。
-
柱面数:所有盘面上编号相同的磁道,竖直对齐后构成一个柱面。因此,柱面数量跟磁道数量完全相等。
-
扇区数:每条磁道被切分成若干个扇区,传统设计下,每条磁道的扇区数量相同。
-
盘片数:就是物理盘片的数量。
有了这些量,磁盘容量就能算出来了:
磁盘容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数
这个公式,就是硬盘标称容量的源头。
三、磁盘是如何读写数据的?
我们常听说,磁盘以扇区为单位读写,一个扇区512字节。这个说法没错,但稍微多想一步,问题就来了。磁盘是圆的,外圈周长长,内圈周长短。如果每个扇区都固定512字节,那外圈一个扇区占的弧长,就应该比内圈长一些。
早期磁盘确实是这样,外圈扇区面积大,信息密度低;内圈扇区面积小,信息密度反而高。同样的数据量,在外圈摊得更开,在内圈挤得更紧。但这带来了一个浪费:外圈明明有更多空间,却因为"每扇区固定字节"的规则,密度被迫降低,没有物尽其用。
于是,后来出现了一种技术叫ZBR(Zone Bit Recording,分区位记录) 。它的思路很聪明:把盘面从外到内分成若干区域,**不同区域每磁道的扇区数不同,**外圈区域每道扇区多,内圈区域每道扇区少。这样,外圈和内圈的物理密度都能维持在接近极限的水平,整块盘的容量就上去了。
ZBR属于更硬核的硬件优化细节,本文不打算钻太深。你只需要记住一个结论:现代磁盘早已不是"每道扇区数固定"的老古董了,内外圈信息密度都在被极限利用。 对上层文件系统来说,这些细节都被隐藏了,它看到的,只是磁盘呈现出来的一串连续可寻址的扇区。
当我们在逻辑层讨论"扇区"时,默认它是磁盘给出的最小读写单元,至于背后ZBR怎么排布、内外圈密度差多少,那是磁盘控制器和固件该操心的事。上层,继续用统一的逻辑扇区号去寻址就够了。接下来,我们就要从这种统一视角出发,正式聊聊数据到底怎么被"找到"和"读写"的。
3.1 CHS寻址方式
柱面(Cylinder)、磁头(Head)、扇区(Sector),三个坐标一凑,就能唯一定位到磁盘上的任意一块数据。这就是最经典的寻址方式之一,CHS 寻址。

它的工作流程,像极了在图书馆找书:
-
寻柱面:驱动磁臂沿径向移动,把磁头架到目标磁道上方。这是最慢的一步,因为要等机械臂"摆过去"。
-
寻磁头:确定要访问哪个盘面,通过电子切换,瞬间激活对应的那个磁头。
-
寻扇区:接下来就是等,等盘片旋转,直到目标扇区恰好转到磁头下方。时机一到,读写开始。
而实际写数据的时候,多个磁头是轮流上场的。比如要把1GB的数据写进去,系统不会东一榔头西一棒子,而是尽量把这些数据塞进同一个柱面里。这个柱面,在三片磁盘上对应的磁道位置完全一样。这样做的好处,是磁头可以连续读完一个柱面再切换到下一个柱面,大幅减少机械移动。
到了软件层,文件存储的逻辑就更直白了:一个文件就是放在一个或多个扇区里,然后记住这几个扇区的CHS地址。下次要读,就按这个地址去"按图索骥"。所以CHS,就是磁盘世界里最原始、最直观的一张寻宝地图。
3.2 磁盘的逻辑结构
3.2.1 从磁带理解数据的线性存储
想想看,我们要读写磁盘上的某一个比特位,会发生什么?没法直接翻到那一位,只能把整个扇区先加载进内存,在内存里改完,再把整个扇区写回去。 为什么这么折腾?因为磁盘太慢了。如果一个字节一个字节地来,光等盘片旋转、磁头挪位的时间,就够让人崩溃的。所以,磁盘读写的铁律是:至少以扇区为单位,一读一写都是一整块。

你小时候玩过磁带吗?此方以前干过一件很缺德的事,把磁带里的带子抽出来,从村东头一路拉到村西头,拉成一条长长的带子。这条带子,就是一根拉直了的线性结构。

磁盘也是这个道理。把盘片想象成磁带,把一圈圈磁道掰直、拉长,你就能得到一条连续的长条。长条被切成一段一段,每一段对应一个扇区。于是,原本藏在"第几柱面、第几磁头、第几扇区"里的物理位置,瞬间变成了一个简单的线性编号,每个扇区,都有了一个从左到右递增的地址。

这种线性地址,就叫LBA(Logical Block Address,逻辑块地址)。说白了,LBA就是磁盘上每个扇区的"数组下标"。它把复杂的三维物理定位,压成了一维的线性编号。上层文件系统再也不用管什么柱面磁头了,只要告诉你"我要第几号扇区",磁盘控制器自己就能翻译成具体的物理位置。这块"抽象化"的功劳,就是LBA存在的最重要意义。

3.2.2 把磁盘理解成一个三维数组
好,能跟上,我们就往深处再走一步。先从一个盘面里抽出一条磁道。别管它平时是圆的,现在"啪"一下,把它剪开、拉直、铺平,一条一维数组出来了,单位就是一个个扇区。


接着,把同一个柱面上的所有盘面都叫过来。这个柱面里,每条磁道上扇区排列都一样。"啪",再展开一次,一个二维数组就此诞生。一行代表一个盘面,一列代表一个扇区。



最后,把整个磁盘上所有柱面都叠起来。柱面一号、柱面二号、柱面三号......一层层码上去,一个完整的三维数组,就在你脑子里立起来了。

所以,逻辑上看,磁盘就是一个庞大的三维数组:柱面是第一维,磁头是第二维,扇区是第三维。 而你再回头看CHS寻址的那三步,会不会突然有种顿悟感?没错,所谓"寻柱面、寻磁头、寻扇区",本质上就是在找这个三维数组的三个下标。
你看,底层那些看似玄乎的物理定位,换个视角就变成了再熟悉不过的数组下标操作。CHS 是三维下标,LBA则是把这个三维数组拍扁后的一维下标。理解了这层关系,接下来我们要聊的两个硬骨头,LBA地址和文件系统,就有支点了。
3.3 LBA逻辑块寻址
还记得我们学C语言时是怎么看待二维数组的吗?不管代码里写的是arr34还是arr235,到了内存层面,它们统统被拍扁成一维的连续空间。高维数组,不过是一维数组的逻辑投影罢了。

磁盘也一样。把3.2.2里那个三维结构,柱面、磁头、扇区,沿着一条线铺开。整条线就是一个磁盘;这条线先被切成一段段柱面,每个柱面里再切开一条条磁道,每条磁道最后被切成一个个扇区。扇区,就是这条线上最小的刻度单位。

于是,每一个扇区,都自然而然地拥有了一个独一无二的下标。这个下标,就是LBA(Logical Block Address,逻辑块地址)。
3.3.1 CHS转换为LBA
CHS和LBA之间的互转,本质上就是三维数组下标和一维数组下标之间的换算。想通这一点,公式就不需要死记硬背了。
先记住几个关键前提:
-
磁头数 == 盘面数,也就等于单个柱面里包含的磁道数量。
-
柱面号:物理上从外向内递增;映射到LBA地址,也是从小到大递增。
-
单个柱面的扇区总数 = 磁头数 × 每磁道扇区数。
然后公式登场:
LBA = 柱面号C × 单个柱面的扇区总数
磁头号H × 每磁道扇区数
扇区号S - 1
把"单个柱面的扇区总数"展开,就是:
LBA = 柱面号C × (磁头数 × 每磁道扇区数)
磁头号H × 每磁道扇区数
扇区号S - 1
这公式到底在算什么?一句话就能说清:
先数你前面躺了多少个完整的柱面,再数当前柱面里你前面躺了多少条完整的磁道,最后加上当前磁道里那零碎的扇区。最后,再把自己(扇区本身)减掉。
因为LBA是从0开始计数,而扇区号是从1开始,所以最后必须来一个-1。柱面和磁道都是从0开始编号,它们本身不需要减。
至于磁盘有多少柱面、多少磁头、每道多少扇区,这些参数根本不用你操心。磁盘内部自己维护着,系统一开机就会自动获取到这套参数,后面做换算时直接拿来用就行。所以,我们只需要理解这层"三维压成一维"的换算逻辑,公式会记最好,不会记也随时能推出来。
3.3.2 LBA转换为CHS
有正向换算,自然也有反向。从一维的LBA回到三维的CHS,公式如下:
柱面号C = LBA // (磁头数 * 每磁道扇区数) // 单个柱面的扇区总数
磁头号H = (LBA % (磁头数 * 每磁道扇区数)) // 每磁道扇区数
扇区号S = (LBA % 每磁道扇区数) + 1
其中//表示整除,只取商;%表示取余,只要余数。
这组公式怎么理解?其实就是一个"剥洋葱"的过程。

你先拿LBA去整除单个柱面的扇区总数,得到的商就是柱面号,因为前面有多少个整柱面,LBA就跨过了多少个柱面的数据量。接着,用余数再去整除每磁道扇区数,得到的商就是磁头号,因为你已经确定了在当前柱面里,这个位置该落在哪一条磁道上。最后剩下的那点余数,就是扇区号。记住,扇区号是从1开始,而余数是从0开始,所以最后要加个1。
正因为LBA和CHS之间可以这样无障碍互转,操作系统内部就完全没必要去记那套繁琐的柱面、磁头、扇区了。它只需要管理LBA就够了。每次要读写数据,只要告诉磁盘三样东西:LBA 地址 + 数据 + 读还是写,磁盘控制器自己就能完成剩余的翻译和机械操作。
再往深说一层,操作系统在真正读写文件时,甚至不需要直接面对裸LBA。它更常做的是:记住一个文件的起始LBA常量 ,再加上一个偏移量。文件写到哪,偏移量就跟到哪;要读哪一段,起始地址加上对应偏移,立刻定位到目标扇区。这就是"基地址 + 偏移"的经典访问模型,在文件系统里还会反复出现。

如果这篇文章对你有帮助,别忘了点个赞、点个收藏、点个关注。你的每一次反馈,都是我继续硬核输出的最大动力。我们下篇见。