【问题标题】:Reading more sectors than there are on a track with int 13h读取比 int 13h 磁道上更多的扇区
【发布时间】:2019-01-22 17:35:11
【问题描述】:

int 13hah=02h 的顺序是什么,如果(软盘)磁盘几何结构为 2 个磁头、每磁道 18 个扇区和每侧 80 个磁道,则从(C, H, S) = (0, 0, 1) 开始的扇区将读取19

或者,更一般地说,当它到达磁道 0 的末尾,磁头 0 时会发生什么?它是去磁道 1 还是磁头 1?在这种情况下它甚至可以正常工作吗?

编辑:等等.. 这真的像小时、分钟、秒吗?如果我们到达轨道的尽头(S大于18),那么H增加?

【问题讨论】:

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

标签: x86 x86-16 bootloader bios floppy


【解决方案1】:

现代 BIOS 支持多轨1 读取和写入的概念。如果您读取或写入超过轨道的末尾,它将继续使用以下轨道。为了与最广泛的 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)

我在 LBA 到 CHS 的转换部分的另一个 Stackoverflow answer 中写了更多关于 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多轨支持并不意味着磁盘访问可以跨柱面。多轨磁盘访问必须在同一个柱面上开始和结束。

【讨论】:

    猜你喜欢
    • 2013-11-20
    • 2014-09-16
    • 2020-02-22
    • 2020-04-12
    • 2019-09-05
    • 2013-11-02
    • 1970-01-01
    • 2013-02-01
    • 2010-12-31
    相关资源
    最近更新 更多