如何确定启动设备

时间:2011-07-22 09:05:04

标签: assembly x86 device boot

我再次提出一个不容易上瘾的问题。我们假设BIOS已从指定的设备加载了我的引导加载程序,我现在如何找出它是哪个设备,以便我可以将我的其余部分加载到ram中?

2 个答案:

答案 0 :(得分:2)

如果是MBR bootstrap(可能还有其他情况?我不是100%肯定)DL将包含 驱动器号,即你可以做这样的事情(替换你自己的内存布局等):

EntryPoint: 
    xor ax, ax
    mov ss, ax
    mov ds, ax
    mov sp, 0x7c00
.DiskReset:
    mov ah, 0
    int 0x13
    jc .DiskReset
    mov ax, 0x50 ; load to 0x500 linear address. It has unused space up to 0x7bff
    mov es, ax
    xor bx, bx
    mov ax, 0x023B ; count = 0x3b = 59, the maximum..
    mov cx, 0x0002
    xor dh, dh ; leave (dl = drive number) intact
    int 0x13
    jnc .ReadDone
    mov si, ReadError
    call PrintString16
    jmp .DiskReset
.ReadDone:
    ; ......

答案 1 :(得分:0)

There's actually a whole protocol between the firmware and the bootstrap program in sector #0.然而,正如您所看到的,大多数只存在于标准文档的页面中,而不是现实中。实际上,当以旧的PC / AT和PC98方式启动时,使用DL作为固件驱动器号并使用BIOS Parameter Block中的“隐藏扇区”字段(或者,更不优选地,“嵌入式阻止列表“使用某种形式的专业工具进行维护”,用于驱动器中卷的位置。

如果一个人在新的(至少是x86个人计算机世界)中引导,那么当然是things are a lot different。操作系统引导加载程序是引导管理器菜单上的一个条目,引导管理器菜单条目具有一个参数系统,它们在运行时由引导管理器传递给加载程序。其中一个参数是引导卷的位置,操作系统引导加载程序使用该位置来查找操作系统文件。这就是Windows NT长期以来的工作方式。