【问题标题】:Is there a way to retrieve the device ID in which the BIOS found and loaded a boot sector?有没有办法检索 BIOS 在其中找到并加载引导扇区的设备 ID?
【发布时间】:2022-01-24 08:27:36
【问题描述】:

我知道 BIOS 按照其配置顺序(可以在 BIOS 设置中更改)通过连接的存储设备(软盘、CD、硬盘驱动器...等),寻找神奇的 16-位值 (0xAA55) 在每个扇区的第一个扇区的末尾,找到一个后,它会加载(刚刚变成的)引导扇区并调用它。

让我们命名包含已加载引导扇区 X 的设备。我的问题是:您能否识别 X 并使用 BIOS 的磁盘中断功能从它读取,而不需要测试每个连接的设备,而不是循环遍历所有设备?例如,BIOS 是否将 X 的 ID 存储在某处?

谢谢。

附:我正在使用 BOCHS 模拟 IA-32 机器,我总是从软盘 #1 加载,所以我可以硬编码从中读取,但为了编写干净的代码和学习我问。我承认测试所有设备绝对是实用的。

【问题讨论】:

    标签: assembly x86 boot bochs


    【解决方案1】:

    当 BIOS 将控制权传递给引导加载程序时,它会将“BIOS 设备 ID”存储在 DL 寄存器中,因此引导加载程序可以只使用它被告知用于所有后续 BIOS 功能的设备 ID。

    主要问题是“BIOS 设备 ID”在早期启动后(操作系统开始使用自己的磁盘驱动程序并停止使用 BIOS 功能后)相对无用;因为没有简单的方法来确定哪个设备恰好被赋予了哪个“BIOS 设备 ID”;特别是对于像“RAID 1 镜像”这样的情况,您可能有 2 个几乎相同的硬盘驱动器,其内容几乎相同。

    我承认测试所有设备绝对是实用的。

    嘿,不。在 2 个不同的硬盘驱动器上安装 2 个单独的操作系统副本(这样您就有 2 个引导加载程序,每个操作系统副本一个),“测试所有设备”就不可能区分您启动的操作系统以及您没有启动的操作系统。

    【讨论】:

    • 谢谢!我正在用 16 位实模式汇编编写整个程序,所以在我非常特殊的情况下,所有磁盘操作都依赖于该 ID。编辑:好吧,鉴于 BIOS 功能的使用,他们依赖于该 ID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2021-05-13
    • 2015-09-29
    • 2021-12-09
    相关资源
    最近更新 更多