我正在研究操作系统的开发。我最近读到硬盘用80h表示,依此类推。但在MBR中,MBR必须检测多个HDD才能选择启动。
这是怎么做到的?如何检测多个硬盘驱动器的可用性并切换到它?
我正在使用:
Ubuntu的
气体装配商
注意:我希望在系统的实模式下使用汇编语言答案。
感谢。
答案 0 :(得分:3)
问题的标题和正文提出了两个不同的内容。
关于引导加载程序如何,或者更好地说IPL(初始程序加载程序),检测哪个设备要引导,你可以{6.5}看到它在6.5.1节中读取
这样一旦启动处理程序成功完成 将设备的引导扇区加载到地址0000:7C00h的内存中,执行控制 可以使用以下寄存器内容进行传输:
- ES:DI =指向PnP安装检查结构的指针
- DL =用于INT 13h(00h,80h等)的驱动器号
因此IPL被赋予从中加载的设备的驱动程序号 然后,IPL可以将它与 INT13h 一起使用来加载第二阶段引导加载程序。
简单地说,如果您正在编写MBR引导加载程序,您可以在dl
中找到驱动程序编号,在保存之前不要覆盖它。
;Simple snippet that load one sector from the booting device
mov ax, LOAD_SEG
mov es, ax
mov bx, LOAD_OFF ;ES:BX = Where to load the data
mov ax, 0201h ;AL = How many sectors
mov cx, 0001h ;CX = Cylinder and sector
xor dh, dh ;DH = Head, DL = Driver number (As given by the BIOS)
int 13h
jc _handle_err
你最好使用check this specification而不是INT13h extensions本身,但出于教育目的,后者更简单。
如果您正在编写INT13h引导程序,那么从技术上讲,您就是自己的,VBR和MBR代码之间没有标准接口。
但是,每个MBR引导加载程序至少为VBR引导加载程序提供驱动程序编号(仍在dl
)
通常会传递更多元数据,但这些数据是专有的。
加载MBR / VBR代码后该怎么做取决于程序员,例如VBR有一个硬编码的LBA(在安装过程中写入)。
此LBA用于使用BIOS中的驱动程序编号加载第二阶段。
第二阶段有一个小文件系统驱动程序,用于通过其路径读取内核的配置文件。
该行的底部是引导加载程序必须知道在哪里找到要加载的其余代码。
这通常是通过在将引导加载程序写入磁盘之前在引导加载程序的二进制映像中写入一些元数据来实现的。另一种策略是依靠MBR代码传递分区号/ start,这样,如果第二阶段在第一阶段之前放置了固定数量的扇区,则引导加载程序知道它在磁盘上的位置,因此第二阶段在第二阶段阶段是。
说到元数据会引导我们进入GRUB 尽管名称不同,它不是由BIOS创建的,但它是操作系统安装/格式化过程的结果。
自定义加载器并不是绝对必要的,它的使用有两个原因:
某些BIOS假设存在BPB,并且可能尝试修补相同的值,尤其是从USB启动时,因此最好至少包括BIOS Parameter Block类NT启动加载程序。
通常,首先要做的是决定分区的布局,包括FS类型和VBR格式。
一般格式是
+------------+------------------------------------+
| boot block | FS block |
+------------+------------------------------------+
在分区的开头为引导加载程序代码保留了一些空间,VBR包含指向FS块的指针。
如果FS足够简单(玩具操作系统可能就是这种情况)或者有特殊支持,引导加载程序可以直接加载内核,从而将引导块缩小到第一个扇区。
作为替代方案,引导加载程序加载第二个阶段,该阶段将具有最小但通用的FS驱动程序以按名称定位内核。
一般来说,VBR代码并不完全独立于卷的FS类型 例如,要在NTFS分区上安装GRUB,您需要使用它的特殊版本DOS 3.31 BPB,它不会使用经典的第二阶段。