硬盘有两种寻址模式,一种就是C/H/S(Cylinder/Head/Sector)寻址模式,也可以称为三维地址模式,这是硬盘最早采用的寻址模式,当时硬盘的容量还非常小,人们采用与软盘类似的结构生产硬盘,也就是硬盘盘片的每一条磁道都具有相同的扇区数,由此产生了所谓的3D参数(Disk Geometry),既磁头数(Heads)、柱面数(Cylinders)、 扇区数(Sectors),以及相应的寻址方式。
在老式硬盘中,由于每个磁道的扇区数相等(与软盘一样),所以外磁道的记录密度要远低于内磁道,因此会浪费很多磁盘空间。为了解决这一问题,进一步提高硬盘容量(C/H/S寻址的容量是有限制的,后面会提到),人们改用等密度结构生产硬盘,也就是说,外圈磁道的扇区比内圈磁道多。采用这种结构后,硬盘不再具有实际的3D参数,寻址方式也改为线性寻址,即以扇区为单位进行寻址,这种寻址模式叫做LBA,全称为Logic Block Address(即扇区的逻辑块地址)。
扇区的三维物理地址与硬盘上的物理扇区一一对应,即三维物理地址可完全确定硬盘上的物理扇区。而在LBA方式下,系统把所有的物理扇区都按照某种方式或规则看做是一个线性编号的扇区,即从0到某个最大值方式排列,并连成一条线,把LBA作为一个整体来对待,而不再是具体的实际的C/H/S值,这样只用一个序数就确定了一个惟一的物理扇区,显然线性地址是物理扇区的逻辑地址。
为了与使用C/H/S寻址的老软件兼容(如使用BIOS Int13H接口的软件)在硬盘控制器内部安装了一个地址翻译器,由它负责将C/H/S参数翻译成LBA地址。
那么LBA地址到底如何与实际的C/H/S值相对应呢?如何把C/H/S地址转换为LBA地址,把LBA地址转换成C/H/S值呢?
首先,我们来了解一下从C/H/S到LBA线性地址的转换规则。由于系统在写入数据时是按照从柱面到柱面的方式,在上一个柱面写满数据后才移动磁头到下一个柱面,并从柱面的第一个磁头的第一个扇区开始写入,从而使磁盘性能最优,所以,在对物理扇区进行线性编址时,也按照这种方式进行。即把第一柱面(0柱)第一磁头(0面)的第一扇区(1扇区)编为逻辑“0”扇区,把第一柱面(0柱)第一磁头(0面)的第二扇区(2扇区)编为逻辑“1”扇区,直至第一柱面(0柱)第一磁头(0面)的第63扇区(63扇区)编为逻辑“62”扇区,然后转到第一柱面(0柱)第二磁头(1面)的第一扇区(1扇区),接着上面编为逻辑“63”扇区,0柱面所有扇区编号完毕后转到1柱面的0磁头1扇区,依次往下进行,直至把所有的扇区都编上号。
另外还要注意C/H/S中的扇区编号从“1”至“63”,而LBA方式下扇区从“0”开始编号,所有扇区顺序进行编号。
掌握了这个关系,我们就可以列出公式来对两种寻址模式进行相互转换。
从C/H/S到LBA的转换公式:
这里规定用C表示当前柱面号,H表示当前磁头号,S表示当前扇区号,CS表示起始柱面号,HS表示起始磁头号,SS表示起始扇区号,PS表示每磁道扇区数,PH表示每柱面磁道数,所以公式为:
LBA=(C–CS)﹡PH﹡PS+(H–HS)﹡PS+(S–SS)
一般情况下,CS=0,HS=0,SS=1,PS=63,PH=255。
下面带入几个值验证一下:
当C/H/S=0/0/1时,代入公式得LBA=0
当C/H/S=0/0/63时,代入公式得LBA=62
当C/H/S=0/1/1时,代入公式得LBA=63
这里不再过多验证,请读者自己进行跟多值的验证,下面来看从LBA到C/H/S的转换关系。
首先介绍两种运算DIV和MOD(这里指对正整数的操作)。DIV称做整除运算,即被除数除以除数所得商的整数部分。比如,3 DIV 2=1,10 DIV 3=3;MOD运算则是取商的余数。比如,5 MOD 2=1,10 MOD 3=1。DIV和MOD是一对搭档,一个取整数部分,一个取余数部分。
各参数仍然按上述假设进行,则从LBA到C/H/S的转换公式为:
C=LBA DIV (PH﹡PS)+CS
H=(LBA DIV PS)MOD PH+HS
S=LBA MOD PS+SS
同样可以带入几个值进行验证:
当LBA=0时,代入公式得C/H/S=0/0/1
当LBA=62时,代入公式得C/H/S=0/0/63
当LBA=63时,代入公式得C/H/S=0/1/1