使用int 13h读取比磁道上扇区数量更多的扇区

3
int 13h指令中,当ah=02h时,将从磁盘几何结构为2个磁头、每个磁道18个扇区、每面80个磁道的(C,H,S)=(0,0,1)处读取19个扇区。更一般地说,当到达0磁道0磁头的末尾时会发生什么?它会去到1磁道还是1磁头?在这种情况下,它是否能正常工作?编辑:等等..这实际上就像小时,分钟,秒钟吗?如果到达磁道末尾(S大于18),那么H会增加吗?

1
现代BIOS支持多轨读写,这意味着如果您在轨道末尾读取或写入数据,它将自动继续到下一个轨道。在非常旧的BIOS中并非总是如此。根据驱动器几何结构,CHS(0,0,18)之后是CHS(0,1,1)。当您达到CHS(0,1,18)时,下一个是CHS(1,0,1)。 - Michael Petch
1
为了最佳兼容性,不应在磁道边界之外读写。 - Michael Petch
1
非常感谢:)这证实了我的编辑——它的工作方式类似于小时,分钟,秒系统。 - PhantomR
1
@MichaelPetch,这听起来像是一个答案,应该在下面发布为答案,以便进行投票、编辑和接受。 - IMSoP
@IMSoP 的确,它真正回答了我的问题。 - PhantomR
1个回答

4
现代BIOS支持多磁道读写的概念。如果您在读取或写入时超出了磁道的末尾,它将继续进行下一个磁道。为了与最广泛的BIOS(新旧)兼容,您可能希望考虑不要跨越磁道边界进行读写。
使用18扇区/磁道、2个磁头和80个柱面(3.5英寸1.44MB软盘)的驱动器几何结构,CHS(0,0,18)后的扇区是CHS(0,1,1)。当您到达CHS(0,1,18)处的扇区时,下一个扇区是CHS(1,0,1)。从某种意义上说,这类似于HH:MM:SS。

根据您的驱动器几何结构,共有2880个扇区(80*2*18)。如果您将扇区编号从0到2879(包括两端),则它们被称为逻辑块地址(LBA)。

Int 13h/ah=2需要 CHS 值。您可以使用以下公式(或等效公式)将 LBA 转换为 CHS 值:

C = (LBA ÷ SPT) ÷ HPC
H = (LBA ÷ SPT) mod HPC
S = (LBA mod SPT) + 1

HPC = Heads per cylinder (aka Number of Heads)
SPT = Sectors per Track, 
LBA = logical block address

"mod" is the modulo operator (to get the remainder of a division)

我在另一个Stackoverflow答案LBA转CHS的翻译部分中更详细地介绍了有关LBACHS计算的内容。如果您使用这些计算创建了一个表格,编号将如下所示:

LBA =    0:   CHS = ( 0,  0,  1)
LBA =    1:   CHS = ( 0,  0,  2)
LBA =    2:   CHS = ( 0,  0,  3)
LBA =    3:   CHS = ( 0,  0,  4)
LBA =    4:   CHS = ( 0,  0,  5)
LBA =    5:   CHS = ( 0,  0,  6)
LBA =    6:   CHS = ( 0,  0,  7)
LBA =    7:   CHS = ( 0,  0,  8)
LBA =    8:   CHS = ( 0,  0,  9)
LBA =    9:   CHS = ( 0,  0, 10)
LBA =   10:   CHS = ( 0,  0, 11)
LBA =   11:   CHS = ( 0,  0, 12)
LBA =   12:   CHS = ( 0,  0, 13)
LBA =   13:   CHS = ( 0,  0, 14)
LBA =   14:   CHS = ( 0,  0, 15)
LBA =   15:   CHS = ( 0,  0, 16)
LBA =   16:   CHS = ( 0,  0, 17)
LBA =   17:   CHS = ( 0,  0, 18)
LBA =   18:   CHS = ( 0,  1,  1)
LBA =   19:   CHS = ( 0,  1,  2)
LBA =   20:   CHS = ( 0,  1,  3)
LBA =   21:   CHS = ( 0,  1,  4)
LBA =   22:   CHS = ( 0,  1,  5)
LBA =   23:   CHS = ( 0,  1,  6)
LBA =   24:   CHS = ( 0,  1,  7)
LBA =   25:   CHS = ( 0,  1,  8)
LBA =   26:   CHS = ( 0,  1,  9)
LBA =   27:   CHS = ( 0,  1, 10)
LBA =   28:   CHS = ( 0,  1, 11)
LBA =   29:   CHS = ( 0,  1, 12)
LBA =   30:   CHS = ( 0,  1, 13)
LBA =   31:   CHS = ( 0,  1, 14)
LBA =   32:   CHS = ( 0,  1, 15)
LBA =   33:   CHS = ( 0,  1, 16)
LBA =   34:   CHS = ( 0,  1, 17)
LBA =   35:   CHS = ( 0,  1, 18)
LBA =   36:   CHS = ( 1,  0,  1)
LBA =   37:   CHS = ( 1,  0,  2)
LBA =   38:   CHS = ( 1,  0,  3)
LBA =   39:   CHS = ( 1,  0,  4)
LBA =   40:   CHS = ( 1,  0,  5)
LBA =   41:   CHS = ( 1,  0,  6)

... [snip] ...

LBA = 2859:   CHS = (79,  0, 16)
LBA = 2860:   CHS = (79,  0, 17)
LBA = 2861:   CHS = (79,  0, 18)
LBA = 2862:   CHS = (79,  1,  1)
LBA = 2863:   CHS = (79,  1,  2)
LBA = 2864:   CHS = (79,  1,  3)
LBA = 2865:   CHS = (79,  1,  4)
LBA = 2866:   CHS = (79,  1,  5)
LBA = 2867:   CHS = (79,  1,  6)
LBA = 2868:   CHS = (79,  1,  7)
LBA = 2869:   CHS = (79,  1,  8)
LBA = 2870:   CHS = (79,  1,  9)
LBA = 2871:   CHS = (79,  1, 10)
LBA = 2872:   CHS = (79,  1, 11)
LBA = 2873:   CHS = (79,  1, 12)
LBA = 2874:   CHS = (79,  1, 13)
LBA = 2875:   CHS = (79,  1, 14)
LBA = 2876:   CHS = (79,  1, 15)
LBA = 2877:   CHS = (79,  1, 16)
LBA = 2878:   CHS = (79,  1, 17)
LBA = 2879:   CHS = (79,  1, 18)

脚注:

1多轨支持并不意味着磁盘访问可以跨越柱面。多轨磁盘访问必须在同一柱面上开始和结束。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接