硬盘逻辑扇区和物理扇区的对应关系

是个好问题。

不过首先你看的这篇文章是错的。先看这张图:

1

除了单碟软盘、单碟单面规格的硬盘,物理磁头数量都大于1。对于硬盘来说,单碟双面的会有两个磁头,双碟四面的是四个磁头……,如此类推。每一个盘面都有若干磁道,相同编号的磁道组成同一个柱面,每条磁道又划分为若干扇区。这个叫CHS(Cylinder Head Sector,柱面-磁头-扇区)寻址方式。早期的硬盘并没有硬盘控制器,操作系统必须知道数据存放的真实位置才能找到需要的数据,因此采用了CHS寻址方式。

后来的硬盘集成了硬盘控制器后,硬盘控制器本身是清楚知道每一块数据的物理位置的,这个时候的CHS地址就不再是真实的数据所在的物理地址了。这个地址是磁盘控制器报告出来的,同时磁盘控制器也可以根据指定的CHS地址找到数据所在的物理位置。

CHS地址位长为24bit,其中10位用来表示柱面,8位用来表示磁头,6位表示扇区,所以理论上支持的最大硬盘容量是512(每扇区字节数)*2^6(扇区)*2^8(磁头)*2^10(柱面)= 8,589,934,592字节= 8,388,608KiB,按照硬盘厂家的标称就是8.4G。但实际上2^8=256,一个硬盘怎么放得下这么多磁头?就算最早的IBM硬盘——两个冰箱那么大的家伙,里面也就50张盘片。

题外话:IBM曾经有一种固定磁头硬盘,在每根磁道上都有一个磁头——要读哪条磁道上的数据,就用对应的磁头读取,可以所有磁头一起读写,获得极其高速的读写速度(和当时的其它磁盘对比)——丧心病狂的设计,不过这玩意磁道就是磁头,所以CHS里面的H,可以理解为盘面号。

随着硬盘存储密度的增大,硬盘厂家引入了LBA(Logical Block Address,逻辑区块位址)寻址模式,只是为了兼容早期的BIOS、操作系统以及软件,才会从LBA根据早期硬盘的CHS和LBA映射公式反算出来的CHS数据。

CHS和LBA的换算公式如图:

翻译一下就是:

C是柱面号,H是磁头号,S是扇区号(扇区号从1开始算,柱面号和磁头号都是从0开始算);

HPC是每个柱面的最大磁头号,对于28bit LBA来说,通常是16;

SPT是每个磁道的最大扇区号,对于28bit LBA来说,通常是64;

所以一般来说是LBA=(柱面号*16+磁头号)*64+(扇区号-1)

就问题的截图来说,根本的错误在于是CHS的用法中,并没有0柱面1磁道这么个东西,x柱面和x磁道在特定的条件下是等价的。对于单张盘片的软盘来说,通常用x磁道的说法,对于多张盘片多个磁头的硬盘来说,通常用x柱面来说——每张盘片上的x磁道组成了x柱面。原文我猜测是作者开始是想表达0柱面1磁头的笔误。

根据上面的公式,这个对应关系应该是这样的:

然而这个只是逻辑上的对应关系,物理上并没有这样的对应关系——硬盘内部早就不用CHS寻址方式来定位数据了,也就不存在说逻辑扇区怎么对应CHS可以避免保证磁盘不动的问题了。

虽然现代磁盘寻址方式不用CHS寻址,不过CHS所代表的数据存放的物理意义还是存在的。只是和CHS固定的每磁道64扇区不同,每圈磁道的扇区数量根据柱面数不同而不同——显然是外圈的扇区更多。也因此在每个扇区大小一致,磁盘转速恒定的前提下,从外圈到内圈的数据读写速度是逐渐下降的。例如下面这张图:

2
另外,现代硬盘的数据密度已经非常高了(单碟容量1.X TB,1Tbit PSI,Per Square Inch,每平方英寸),这个密度下,盘片不可能是毫无瑕疵的。因此现代硬盘都另外有一个逻辑扇区映射表,只是这个映射表不再是上面的公式那么简单了。这个映射表中,会考虑如何组织数据物理位置和逻辑扇区的对应关系,使得多个盘面的情况下读写数据效率更高,寻道时间更短的。

题外话:现代硬盘如果出现坏扇区,用厂家提供的工具做一次全盘置零操作,可以修复坏扇区的原理就是重新建立这个映射表,用保留的备用扇区替代损坏的扇区。

我个人的猜测,即使这样,也不会采用相邻的扇区分布在多个盘面上的这种组织方式,因为扇区是人为的划分,盘片转动一圈,磁头读取出来的是一串连续的二进制数据。如果相邻的扇区分布在多个盘面上,磁盘控制器需要对这一串数据进行截短,然后按照盘片顺序重新组织再传输出去。无谓的增加了控制器的计算量。

 

来源:https://www.zhihu.com/question/67935624