Re:Linux系统篇(二十五):文件系统(一):磁盘硬件底层原理:从物理结构到 CHS/LBA 寻址,搞懂硬盘数据的定位逻辑


观众老爷们大家好 这里是邪修KING的独家频道 本文属于系列Linux系统篇 ------文件系统 一起学Linux的小伙伴可订阅专栏: Linux系统篇

我们每天在电脑上存储文档、照片、视频,接触的都是 C 盘、D 盘里的文件和文件夹。但你有没有想过,这些数据最终落在硬盘上,究竟是怎么存放的?系统又是怎么精准找到某一个文件的?

很多人听过磁道、扇区、柱面这些名词,但始终一知半解。本文就从机械硬盘的物理结构讲起,一步步拆解 CHS 和 LBA 两种寻址方式,带你看懂硬盘最底层的数据定位逻辑。

一、机械硬盘的物理构成

机械硬盘(HDD)是计算机中为数不多的纯机械设备,依靠磁效应来存储数据。它最大的特点是容量大、单价低,但读写速度慢,和现在常用的固态硬盘(SSD)形成互补。

整个硬盘的核心部件可以分为三类:盘片、磁头组件、主轴。

1. 盘片(Platter)

盘片是数据真正的载体,就像一张圆形的光盘,表面涂有磁性材料。一个硬盘内部可以叠放多张盘片,每张盘片的上下两个盘面都可以存储数据,每个盘面对应一个磁头。

2. 磁头与磁头臂

每个盘面都配有一个磁头,就像写字的笔尖,负责在盘片上读取和写入数据。

⚠️ 一个非常重要的特性:所有磁头都固定在同一个磁头臂上,共进退。也就是说,当一个磁头移动到某一圈磁道上时,其他所有盘面的磁头,都会对准相同半径的位置。

3. 主轴

主轴带动所有盘片高速旋转,我们常说的 7200 转、5400 转,指的就是主轴每分钟的转速。转速越高,读写的延迟就越低。

二、磁盘的存储结构:磁道、扇区、柱面

盘片是圆形的,数据不可能随便乱堆,它被划分成了一层层规整的结构,就像我们在纸上画格子写字一样。

1. 磁道(Track)

盘片上一圈圈的同心圆,就是磁道。从外圈开始编号,0 磁道、1 磁道、2 磁道...... 越往内圈半径越小。最靠近主轴的一圈是磁头停靠区,不存储数据。

可以类比成老式唱片上的一圈圈纹路,每一圈就是一条磁道。

2. 扇区(Sector)

把一个磁道均匀切成一个个扇形的小块,每一块就是一个扇区。

  • 扇区是磁盘物理读写的最小单位,传统机械硬盘的扇区大小固定为 512 字节。
  • 每个磁道上的扇区数量是相同的。

可以类比成把披萨切成均等的小块,每一块披萨就是一个扇区。

3. 柱面(Cylinder)

因为所有磁头共进退,所有盘面上、半径相同的磁道,合起来就构成了一个 "柱面"。

  • 柱面数 = 单个盘面的磁道总数
  • 柱面是磁盘分区的最小单位

4. 磁盘容量计算公式

知道了这几个概念,我们就能算出一块硬盘的总容量:

磁盘容量 = 磁头数 × 柱面数 × 每磁道扇区数 × 每扇区字节数

举个例子:2 张盘片 = 4 个磁头,1024 个柱面,每磁道 63 个扇区,每个扇区 512 字节,总容量就是 4 × 1024 × 63 × 512 ≈ 126MB。

三、CHS 寻址:早期的三维定位

早期的硬盘,就是通过柱面(Cylinder)、磁头(Head)、扇区(Sector) 这三个参数来定位一个扇区,简称 CHS 寻址。

它的逻辑就像三维坐标:

  1. 先确定柱面号:让磁头臂移动到对应的磁道上
  2. 再确定磁头号:选中具体哪个盘面
  3. 最后确定扇区号:等盘片旋转到对应扇区经过磁头下方,就可以读写数据了

CHS 的局限

当年的系统给 CHS 三个参数分配的位数有限:

  • 磁头:8 位
  • 柱面:10 位
  • 扇区:6 位

按这个位数计算,最大能支持的容量约为 8GB。硬盘容量超过 8GB 后,CHS 寻址就不够用了。所以现在的操作系统,基本不再直接使用 CHS 寻址。

四、LBA 寻址:现代硬盘的线性地址

既然三维的 CHS 不够用,人们就想到了简化:把整个硬盘所有的扇区,按顺序排成一个一维数组,给每个扇区编一个号,从 0 开始,这个编号就是LBA(逻辑块地址)

可以理解成:把卷起来的磁带完全拉直,每一小段按顺序排号,想找哪一段,直接报编号就行,不用再说第几圈第几个。

1. CHS 与 LBA 的转换

CHS 和 LBA 是可以互相换算的:

  • CHS 转 LBALBA = 柱面号C × (磁头数 × 每磁道扇区数) + 磁头号H × 每磁道扇区数 + 扇区号S - 1
    减 1 是因为扇区号从 1 开始编号,而 LBA 从 0 开始。
  • LBA 转 CHS
    就是反过来做除法取整、取余:
    • 柱面号 = LBA // (磁头数 × 每磁道扇区数)
    • 磁头号 = (LBA % (磁头数 × 每磁道扇区数)) // 每磁道扇区数
    • 扇区号 = (LBA % 每磁道扇区数) + 1

2. 关键结论

现在的操作系统,根本不需要关心 CHS 地址,直接使用 LBA 地址访问硬盘。CHS 和 LBA 之间的转换工作,完全由硬盘内部的固件(硬件电路 + 伺服系统)自动完成。

对上层软件来说,硬盘就是一个 "元素为扇区的一维数组",数组的下标就是 LBA 地址。

总结

理解磁盘的物理结构和寻址方式,是理解文件系统的基础。我们知道了硬盘最底层是一个个 512 字节的扇区,用 LBA 编号来定位。

但我们平时不可能直接用扇区号去存数据,那样太反人类了。我们需要的是 "文件名、文件夹、权限" 这些更友好的概念,这就是文件系统要做的事 ------ 把零散的扇区组织成可管理的文件。

相关推荐
驭渊的小故事1 小时前
Spring Boot 注解详解01
java·前端·spring boot
泡海椒1 小时前
jquick-pdf 超详细入门教程:Java 轻量级 HTML 模板生成 PDF 工具
java·开发语言
小则又沐风a1 小时前
TCP协议讲解-----了解TCP可靠性的基石
linux
蛋先生DX1 小时前
Java和Go都拍胸脯说"内存我包了",可它们到底是怎么下手的?
java·go·编程语言
运维栈记1 小时前
使用 MinIO Client (mc) 将自建 MinIO 数据备份至阿里云 OSS
运维·阿里云
SimonKing1 小时前
阅后即焚的加密便签:Cryptgeon,你口袋里的秘密信使
java·后端·程序员
鲁邦通物联网1 小时前
海外设备怎么远程维护?工业路由器远程运维架构设计
运维·网络·智能路由器·工业路由器·工业级路由器·5g路由器·5g工业路由器
刚入门的大一新生1 小时前
Linux-简单设计libc库
linux·c++
ss2731 小时前
Java全栈实战 | 1.3-03 索引原理:联合索引 (a,b,c) 只查 b 走不了索引?B+ 树一图讲透所有索引玄学
java·数据库