2011-07-22 33 views
3

我又有一个问题不容易实现。让我们假设BIOS已经从指定的设备加载了我的启动加载程序,我现在怎么知道它是哪个设备,我可以将我的OS的其余部分加载到内存中?如何确定启动设备

回答

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: 
    ; ...... 
+0

thx很多家伙..我从来不知道这是DL的价值所代表的。 – Pyjong

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长期以来的工作方式。