我再次提出一个不容易上瘾的问题。我们假设BIOS已从指定的设备加载了我的引导加载程序,我现在如何找出它是哪个设备,以便我可以将我的其余部分加载到ram中?
答案 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长期以来的工作方式。