如何在BIOS下使用USB闪存驱动器进行低级IO(与软盘相比)?

6

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

For example, here is a snippet of the floppy code (GNU assembler):

    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中的第一个硬盘。在我的特定BIOS中,我可以更改驱动器顺序,其中包括USB驱动器。我相当确定这已经取决于BIOS,但我认为在BIOS中列出的顺序可能对应于我移动到%dl中的值。我需要找到一些文档来跟踪...

由于我对块设备的工作非常不熟悉,有人能指点我开始学习的好地方吗?

谢谢!

3个回答

5
简单来说,如果BIOS能够从USB闪存驱动器引导,则可使用与软盘/硬盘访问相同的BIOS功能。

简单的技术可以让相同的引导扇区代码在使用软盘磁盘仿真或硬盘驱动器仿真启动时,都能够访问USB闪存驱动器上的软盘映像。如果dl = 80h(硬盘驱动器仿真)
“获取驱动器参数” int 13h,ah = 8 返回:ch = 最大扇区数(与每个磁道的扇区数相同)dh = 最大磁头数(只需加1即可获得磁头数)
此返回信息描述了模拟设备的几何形状(如果dl = 0,则为标准软盘几何形状-每个磁道18个扇区和2个磁头)。这可以用于计算所需的圆柱头扇区信息,以便进行:
“读扇区” int 13h,ah = 2

“写扇区” int 13h,ah = 3
请参见 Ralf Brown的中断列表-int 13h

查看我的帖子:USB启动秘籍


好的,重新审视了一下,我看了一些代码(可工作的代码),即使使用USB闪存驱动器,它也明确地加载dl=0x00。现在我猜这是基于BIOS的行为,也许其他BIOS不允许您将闪存驱动器视为软盘。 - Mr. Shickadance
1
可以在任何支持从USB闪存驱动器启动的BIOS/版本上,使用FAT12软盘映像文件来引导和运行。必须使用dl值。即使dl=80h(这将是所有后期型号BIOS/版本的情况),也可以使用从int 13h,ah=8返回的硬盘几何信息。1.44 MB格式虽然有限,但对于起步来说已经足够,并且是通用的。 - Mike Gonta

3

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


确实有很大的帮助。此外,需要指出一些BIOS会直接将闪存驱动器标记为0x80,就像我的问题中所述。 - new123456

0

如果BIOS支持,闪存驱动器才可用。如果支持,它可能已经允许您从中启动。大部分是通过仿真完成的,因此引导闪存驱动器的调用可能是相同的。

我已经转储了我的闪存驱动器的引导块,并找到了软盘和硬盘格式。

也许您应该尝试一堆数字来访问驱动器并查看哪些会回答。

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


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