【问题标题】:BIOS INT 13H with AH=2 can only read 72 sectors each time. Why?AH=2 的 BIOS INT 13H 每次只能读取 72 个扇区。为什么?
【发布时间】:2011-04-08 10:20:03
【问题描述】:

我正在使用 Bochs 2.4.5 编写引导扇区代码。我使用 INT 13H 从软盘读取扇区。但是我发现如果要读取的扇区数> 72,则INT13会失败。返回码是AH=1。下面是代码,这里是INT13。返回码是 AH=1。

为什么 INT 13H 不能读取超过 72 个扇区?

   xorb %ah, %ah
   xorb %dl, %dl
   int $0x13      # reset the floppy

   movw $0x8000, %ax
   movw %ax,%es        
   movw $0, %bx  # ES:BX is the buffer  
   movb $0x02, %ah
   movb $73, %al # how many sectors to read. 72 is ok, but >=73 is wrong.
   movb $0, %ch
   movb $1, %cl
   movb $0, %dh
   movb $0, %dl

   int $0x13

感谢您的帮助。

更新

按照Matthew Slattery的指令,我找到了对应的代码。我在这里列出了它,以供像我一样困惑的其他人使用。完整代码位于here

7220       if ((drive > 1) || (head > 1) || (sector == 0) ||
7221           (num_sectors == 0) || (num_sectors > 72)) {
7222         BX_INFO("int13_diskette: read/write/verify: parameter out of range\n");
7223         SET_AH(1);
7224         set_diskette_ret_status(1);
7225         SET_AL(0); // no sectors read
7226         SET_CF(); // error occurred
7227         return;
7228       }

【问题讨论】:

    标签: c operating-system dos bios


    【解决方案1】:

    您使用的是 Bochs,因此可以在 Bochs BIOS source 中找到答案:BIOS 正在对扇区数执行显式范围检查,如果大于 72(或等于 0)则拒绝它.

    【讨论】:

    • 我不是汇编语言的老手。你能指出范围检查在哪里吗?
    • 我的答案中的链接应该带你到正确的地方,在 C 代码中:bios/rombios.c 的第 7211 行(截至 Bochs v2.4.5),这实际上是int13_diskette_function() 内的相关 case 语句 - 包括范围检查的参数验证是其中的第一个 if (...),在第 7220-7221 行。
    • 我想在这里发表评论/提问,您不应该考虑每个轨道的扇区吗?意思是,调用 bios 中断 0x13 并在 1.44mb 软盘上请求超过 18 个扇区真的有效吗?如果您的引导加载程序正在从一个连续的集群中读取数据,它应该进行计算以根据需要推进任何轨道/柱面。
    • 这取决于 BIOS 和硬件。一个真正的软盘控制器至少应该允许同时从两个磁头读取(多磁道模式),并且一个真正的 BIOS probably 支持这一点。 Bochs BIOS 接受多达 72 个扇区的请求并向 FDC 发出单个命令; Bochs 模仿 FDC will happily advance to the next cylinder in multi-track mode。所以它可以在 Bochs 中运行,但如果计划在真实系统上运行,可能需要更加谨慎。
    【解决方案2】:

    Matthew Slattery 指出的简单答案是,这仅仅是 Bochs 执行的范围检查。这是基于 2.88Mb 软盘多磁道软盘控制器读取限制为 72 个扇区。


    令人高兴的答案是,由于向后兼容,当前的 BIOS 仅支持单面读取,对于 1.44Mb 软盘来说,最多 18 个扇区。这取决于起始扇区,因此实际最大值将达到轨道上剩余的总数。从 USB 闪存驱动器引导和运行是用于 os dev 的过时软盘的简单替代方案。根据引导驱动器标识符(dl 寄存器),可以使用相同的 BIOS 磁盘/软盘功能。

    【讨论】:

      【解决方案3】:

      根据Standard Floppy Disks Supported by MS-DOS,1.44 MB 软盘上每个磁道的扇区数为 18。由于 18*4 = 72,这可能是一个线索。 BIOS 可能不想一次读取超过一定数量的磁道。

      【讨论】:

      • 感谢您的提示。但为什么要乘以 4?我会继续寻找。
      • @smwikipedia 虽然这已经快 4 岁了,但我会做这个观察。我不认为 72 是 Bochs 任意的。 72 恰好是产生的最大容量 软盘(2.88mb 软盘,每个磁道 36 个扇区和 2 个磁头)的单个柱面上的扇区数 36*2=72。
      • 续... 而且并非所有 BIOS 都支持跨柱面边界读取,因此您应该假设您无法越过柱面边界进行编程。因此,根据我之前评论中给出的原因,在任何出现的 软盘 格式中,有意义的最大值都是 72。
      猜你喜欢
      • 2014-09-16
      • 2020-02-22
      • 2012-01-31
      • 2019-09-05
      • 2015-09-29
      • 2020-04-12
      • 2013-11-20
      • 1970-01-01
      相关资源
      最近更新 更多