C/H/S地址 |
LBA编号 |
||
柱面 |
磁头 |
扇区 |
|
0 | 0 | 1 | 0 |
0 | 0 | 2 | 1 |
0 | 0 | 3~63 | 2~62 |
0 | 1 | 1 | 63 |
0 | 1 | 2~63 | 64~125 |
0 | 2 | 1~63 | 126~188 |
0 | 3 | 1~63 | 189~251 |
1 | 0 | 1 | 252 |
1 | 0 | 2~63 | 253~314 |
1 | 1 | 1 | 315 |
… | … | … | … |
知识提示:物理扇区是指某个扇区在硬盘上的绝对位置,可以由柱面、磁头与扇区来唯一定位,即柱面、磁头、扇区与硬盘上每一个扇区有一一对应关系。
2.C/H/S到LBA的转换公式
掌握了C/H/S与LBA的转换规则,就可以通过公式对两种寻址模式进行相互转换。这里首先讲解从C/H/S到LBA的转换公式。
以C、H、S分别表示当前硬盘的柱面号、磁头号、扇区号,CS、HS、SS分别表示起始柱面号、磁头号、扇区号,PS表示每磁道扇区数,PH表示每柱面总的磁道数。则C/H/S到LBA的转换公式为:
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/63时,LBA=62;当C/H/S=0/1/1时,LBA=63;当C/H/S=185/20/50时,LBA=2 973 334。
3.LBA到C/H/S的转换公式
在介绍从LBA到C/H/S的转换公式前,先来了解DIV和MOD两种运算符(这里指对正整数的操作)。DIV是做整除运算,即被除数除以除数所得商的整数部分,如3 DIV 2=1,8 DIV 3=2;MOD运算则是取余数,如5 MOD 3=2,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=63时,得C/H/S=0/1/1,当LBA=2 973 334时,代入公式得C/H/S=185/20/50。
若不想使用MOD运算符,只使用DIV运算符,则转换公式可改为:
C= LBA DIV(PH×PS)+ Cs
H=LBA DIV PS–(C-Cs)× PH + Hs
S=LBA–(C–Cs)× PH
× PS –(H–Hs)×Ps + Ss
;------------------------------------------------------------------
实现LBA转C/H/S (这种转换好如给一个十进制整数,要你取得每一个十进制位,只不过进位有些不同1024 255 63):
逻辑扇区LBA=0 => C/H/S=0/0/1
逻辑扇区LBA=63 => C/H/S=0/1/1
逻辑扇区LBA=2973334 => C/H/S=185/20/50
绝对扇区=(逻辑扇区 mod 每个柱面的总扇区数) +1
绝对磁头=(逻辑扇区/每个柱面的总扇区数) mod 总磁头数
绝对柱面= 逻辑扇区/(每个柱面的总扇区数 * 总磁头数)
小技巧:
对于1.44软盘可以用下面的汇编段转换
DIV r/m16 DX:AX by r/m16, with result stored in
AX ← Quotient, DX ←Remainder
Lbachs:
xor dx, dx
div WORD [SectorsPerTrack]
inc dl
mov BYTE [absoluteSector], dl
xor dx, dx
div WORD [NumHeads]
mov BYTE [absoluteHead], dl
mov BYTE [absoluteTrack], al
ret