我们学完了系统文件IO,但是没有对磁盘文件做一个了解,于是这个系列将解答一下磁盘存储相关知识
作为计算机系统里 "特殊" 的硬件 ------ 机械磁盘是唯一带机械设备的外设,它不像 CPU、内存那样靠纯电子元件工作,却凭借 "大容量、低成本" 的优势,成为数据持久化存储的核心。今天我们就从硬件基础到地址寻址,一步步揭开磁盘的底层秘密
下面是磁盘的图片:

一、计算机里的 "大块头":磁盘的硬件定位
在服务器、机柜乃至整个机房的硬件体系里,磁盘始终扮演着 "数据仓库" 的角色。我们先明确几个基础认知:
- 磁盘的身份:属于计算机外设,不是核心运算部件,这意味着它的数据传输需要经过 I/O 总线,速度远慢于内存(内存是纳秒级,磁盘是毫秒级);
- 机械属性:机械磁盘内部有高速旋转的盘片、可移动的磁头,是计算机中唯一的机械设备 ------ 这也是它 "慢" 的根源,但同时让它能以极低的成本提供大容量存储(比如 1TB 机械盘价格仅为同容量固态硬盘的 1/3);
- **题外话:机房里的磁盘与 "磁铁"**机房里的磁盘通常以 RAID 阵列形式存在,确保数据可靠性;而磁盘的核心原理是 "磁记录"------ 盘片表面的磁性材料通过不同的磁化方向存储 0 和 1,拆开磁盘(非专业勿试!)能看到里面的永磁体,这就是 "磁铁" 的由来
下面是服务器,机柜,机房的相关图片:



二、磁盘的物理结构:三维空间里的 "数据格子"
要理解磁盘怎么存数据,得先拆穿它的 "物理真面目"。一块机械磁盘的核心部件包括:盘片(platter)、磁头(head)、传动臂、主轴电机,而数据存储的最小单元是扇区(sector)(512 字节,磁盘属于 "块设备",读写必须按扇区为单位)

我们可以把磁盘想象成多层的 "甜甜圈",每个 "甜甜圈" 的结构对应这些关键概念:
- 盘片:就是 "甜甜圈" 本身,一块磁盘通常有多个盘片,每个盘片有上下两个面(都能存数据)
- 磁头 :每个盘面对应一个磁头,负责读写数据 ------ 所有磁头固定在同一根传动臂上,共进退(这是关键细节,后面寻址会用到)
- 磁道(track):盘面上一圈圈的同心圆,从外圈到内圈编号(0 磁道、1 磁道......),靠近主轴的最内圈是磁头停靠区,不存数据
- 柱面(cylinder):所有盘面上相同编号的磁道合起来就是一个柱面(比如所有盘面的 0 磁道构成 0 柱面),柱面数量等于单个盘面的磁道数
- 扇区:每个磁道被切成若干扇形区域,就是扇区 ------ 每个磁道的扇区数量相同,这是数据存储的最小单位


磁盘容量怎么算?
记住这个公式:磁盘容量 = 磁头数 × 柱面数(磁道数) × 每磁道扇区数 × 每扇区字节数(通常512)比如一块磁盘有 2 个磁头、1024 个柱面、63 个每磁道扇区,容量就是:2×1024×63×512 = 6442450944 字节 ≈ 6.4GB
三、从三维到一维:CHS 寻址与 LBA 的诞生
知道了物理结构,接下来的问题是:怎么找到某个具体的扇区?这就引出了两种寻址方式。
1. CHS 寻址:早期的 "三维定位"
CHS 是磁头(Head)、柱面(Cylinder)、扇区(Sector)的缩写,是早期磁盘的寻址方式 ------ 就像在图书馆找书:先确定楼层(磁头)、再找书架(柱面)、最后定位某一层的书(扇区)
比如要找某个扇区,步骤是:① 传动臂带动磁头移动到目标柱面;② 磁头对准目标盘面;③ 盘片旋转,让目标扇区转到磁头下方
但 CHS 有个致命缺点:容量限制。早期系统用 8bit 存磁头数(最多 256 个)、10bit 存柱面数(最多 1024 个)、6bit 存扇区数(最多 63 个),算下来最大支持容量:256×1024×63×512B = 8064MB ≈ 8.4GB(按 1MB=1048576B 算)------ 这显然满足不了现代大容量磁盘的需求
2. LBA 寻址:把磁盘 "掰直" 成一维数组
既然 CHS 有局限,工程师们想到了一个办法:把磁盘的三维物理结构抽象成一维的线性地址 ------ 这就是 LBA(Logical Block Address,逻辑块地址)
为什么能 "掰直"?
我们可以做个类比:
- 把单个柱面展开:每个柱面包含多个磁道(对应磁头数),每个磁道有多个扇区,相当于一个二维数组;
- 把整个磁盘的所有柱面按顺序排列:就变成了一个三维数组;
- 而计算机最擅长处理一维数组,所以我们给每个扇区分配一个唯一的 "下标"(从 0 开始),这个下标就是 LBA 地址



LBA 与 CHS 的转换:磁盘自己搞定!
OS(操作系统)不需要关心复杂的 CHS,只需要给磁盘传一个 LBA 地址,磁盘的固件(硬件电路 + 伺服系统)会自动完成转换:
- CHS 转 LBA :
LBA = 柱面号C × (磁头数×每磁道扇区数) + 磁头号H × 每磁道扇区数 + 扇区号S - 1(扇区号从 1 开始,LBA 从 0 开始,所以要减 1) - LBA 转 CHS :
柱面号C = LBA // (磁头数×每磁道扇区数)``磁头号H = (LBA % (磁头数×每磁道扇区数)) // 每磁道扇区数``扇区号S = (LBA % 每磁道扇区数) + 1
举个例子:磁头数 2,每磁道扇区数 63,LBA=1000C = 1000 // (2×63) = 1000//126 = 7余数 = 1000 % 126 = 1000 - 7×126 = 1000-882=118H = 118 // 63 = 1S = 118 % 63 +1 = 55 +1=56即 LBA=1000 对应 CHS:C=7,H=1,S=56
四、总结:磁盘寻址的本质
对我们(以及 OS)来说,磁盘就是一个 "元素为扇区的一维数组",数组下标是 LBA 地址 ------ 我们不用关心磁头怎么移动、盘片怎么旋转,只需要告诉磁盘 "我要访问 LBA=XXX 的扇区",剩下的底层转换全由磁盘固件完成
理解这些底层逻辑,不仅能搞懂 "磁盘为什么慢"(磁头移动、盘片旋转需要时间),也为后续学习文件系统(比如 EXT4、NTFS 怎么管理扇区)打下基础 ------ 毕竟所有文件的内容和属性,最终都是存在一个个扇区里的