【问题标题】:How to perform low-level IO with a USB flash drive under the BIOS (compared to a floppy)?如何在 BIOS 下使用 U 盘进行低级 IO(与软盘相比)?
【发布时间】:2010-10-07 14:28:37
【问题描述】:

我最近一直在研究一些用于软盘驱动器的引导代码。我的目标是修改程序,以便它使用我的 USB 闪存驱动器。现在我看到了 INT 13H 函数是如何与软盘设备一起使用的,但我想我的问题是,与 USB 驱动器的通信会有什么不同?

例如,这里是软盘代码(GNU 汇编器)的 sn-p:



    movb    $0x00,%dl       /* select 1st floppy */

    /* later */

    movw    sec,%cx     /* get sector number */
    movw    head,%dx    /* get head number */

    movw    $0x0201,%ax /* read 1 sector */
    int $0x13

现在我读到将 0x80 移动到 %dl 将选择 BIOS 中的第一个 HDD。在我的特定 BIOS 中,我可以更改驱动器顺序,其中包括 USB 驱动器。我很确定这将变得依赖于 BIOS,但我认为 BIOS 中列出的顺序可能对应于我移入 %dl 的值。我需要查找一些文档...

我真的不熟悉使用块设备,有人可以指点我一个开始学习更多信息的好地方吗?

谢谢!

【问题讨论】:

    标签: assembly x86 bios usb-drive bootstrapping


    【解决方案1】:

    简单的答案是,如果 BIOS 可以从 USB 闪存驱动器启动,则可以使用用于软盘/硬盘驱动器访问的相同 BIOS 功能。

    令人高兴的答案是,一种简单的技术允许相同的引导扇区代码访问 USB 闪存驱动器上的软盘映像,无论它是使用软盘仿真还是硬盘驱动器仿真启动的。如果 dl=80h(硬盘仿真)

    获取驱动器参数
    int 13h, 啊=8
    返回:
    ch=最大扇区数(与每个磁道的扇区数相同)
    dh=最大人头数(加1得到人头数)

    返回的信息描述了模拟设备的几何结构(如果 dl=0,那么它是标准的软盘几何结构 - 每个磁道 18 个扇区和 2 个磁头)。这可用于计算所需的气缸盖扇区信息:

    读取扇区
    int 13h, ah=2

    写入扇区
    int 13h, ah=3

    Ralf Brown's Interrupt List - int 13h

    在这里查看我的帖子:USB Booting Secrets

    【讨论】:

    • 好的,重新审视了这个,我正在查看一些代码(工作代码),即使它使用的是 USB 闪存驱动器,它也会显式加载 dl=0x00。现在我猜这是与 BIOS 相关的行为,也许其他 BIOS 不允许您将闪存驱动器视为软盘。
    • 在任何可以从 USB 闪存驱动器启动的 BIOS/版本上,从 USB 闪存驱动器启动和运行 FAT12 软盘映像都是可能且方便的。必须使用 dl 值。即使 dl=80h(在所有最新型号的 BIOS/版本上都是这种情况)从 int 13h 重新调整的硬盘驱动器几何形状,也可以使用 ah=8。 1.44 MB 的格式虽然有限制,但对于入门来说已经足够了,而且是通用的。
    【解决方案2】:

    如果 BIOS 将 USB 设备“视为”硬盘驱动器,它将为其分配一个编号。第一个硬盘驱动器的分配编号从 0x80 开始,第二个硬盘驱动器从 0x81 开始,依此类推。因此,根据安装的硬盘数量,您的 USB 驱动器将位于 0x81 或更大。此外,如果您在 BIOS 中更改顺序,USB 驱动器编号也会随之变化。

    【讨论】:

    • 真的帮了大忙。此外,并非某些 BIOS 直接将闪存驱动器标记为 0x80,如 my question
    【解决方案3】:

    闪存驱动器仅在 BIOS 支持时可用。如果是这样,它可能已经让你从它启动了。其中大部分是通过仿真完成的,因此启动闪存驱动器的调用可能相同。

    我已经从拇指驱动器中删除了引导块,并找到了软盘和硬盘驱动器格式。

    也许您应该尝试使用一堆数字来访问驱动器,然后看看哪个会回答。

    我认为 Google 是您的朋友。从“INT 13H”开始。并提出更多问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-02
      • 2011-01-04
      • 2014-12-28
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 2012-01-31
      • 2012-02-21
      相关资源
      最近更新 更多