【问题标题】:PC boot: dl register and drive numberPC 启动:dl 寄存器和驱动器号
【发布时间】:2012-06-25 19:50:43
【问题描述】:

我在互联网的某个地方读到,在跳转到 0x7c00 之前,BIOS 将已启动设备的“驱动器号”加载到 %dl 中。但是这个“驱动器号”是什么?连接到计算机的每个设备都由 BIOS 分配一个编号?如果是这样,我如何知道给定设备分配给了哪个号码?

阅读 GRUB 的源代码时我发现当 %dl 设置了位 0x80 和 0x70 时,它会用 0x80 覆盖整个寄存器。这是为什么?代码如下:

jmp 3f      /* grub-setup may overwrite this jump */
testb $0x80, %dl
jz 2f
3:
/* Ignore %dl different from 0-0x0f and 0x80-0x8f.  */
testb $0x70, %dl
jz 1f
2:     
movb $0x80, %dl
1:

顺便说一句。网上有没有关于电脑启动过程的详细资源?特别是关于 BIOS 在将控制权交给引导加载程序之前所做的事情以及用于与之通信的标准代码(如“驱动器编号”)。我希望编写自己的引导加载程序,但我发现的所有内容都太模糊了,技术上还不足以在引导加载程序开始运行时通知计算机的确切状态。

【问题讨论】:

    标签: assembly x86 bootloader x86-16 bios


    【解决方案1】:

    BIOS int 13h 函数接受驱动器号。它应该是DL 中的那种驱动器号,一个 BIOS 可以理解,因为它本身使用 int 13h 来加载引导扇区。

    【讨论】:

    • 好的。我知道bios理解它,但我也想理解。 :) 我想知道的是这些代码是如何分配的。就像,如果它们是静态的(给定设备为 0,另一个设备为 1……等等),如果是这样,我在哪里可以得到这个列表;如果不是,bios 是如何分配它们的。
    • AFAIK,0x80 是引导硬盘驱动器的唯一有效驱动器号,类似地 0x00 用于引导软盘驱动器。代码中有这样的注释:This is a workaround for buggy BIOSes which don't pass boot drive correctly. If GRUB is installed into a HDD, check if DL is masked correctly. If not, assume that the BIOS passed a bogus value and set DL to 0x80, since this is the only possible boot drive. If GRUB is installed into a floppy, this does nothing (only jump). 传统上就是这样。非引导驱动器数量更高。
    • 我明白了。闪存驱动器和 cd-rom 驱动器的编号是否相同 (0x80)?
    • 如果你从那里启动,它应该是 0x80。
    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 2011-09-04
    • 2015-02-12
    • 2018-11-11
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多