CPU通电后在Reset信号的作用下,其CS寄存器被置为0xFFFF,IP寄存器被置为0x0000。因此,指令总是从存储空间0xFFFF0开始执行。而这个内存空间属于ROM空间。关于IBM-PC内存布局如下图所示:
在这个地址一般存放一条转移指令跳转到BIOS中的POST程序(Power-ON Self Test),完成系统自检。在自检的最后步骤,POST程序会检查CMOS中关于启动盘的相关设置,并根据设置从启动盘的MBR(主引导记录)中加载启动程序。MBR中的内容一般由操作系统写入,但和某种操作系统没有特定关系。MBR的结构如下:
其中有效标志0x55AA表示该分区为有效分区。
分区表(DPT)最多只能包括4条分区记录,每条记录由16B组成。各字节含义组成如下:
在采用MBR分区的硬盘中,最多只支持4个主分区,或3个主分区和一个扩展分区(Windows)。在MBR分区表中,一个分区最大的容量为2T【以512B/扇区计算】(最大总扇区数0x100000000 * 0x200=2T),且每个分区的起始柱面必须在这个disk的前2T内。对于2T以上的硬盘,可采用GPT分区方式(GPT分区暂时不讨论)。
MBR引导程序通常利用BIOS的Int 19中断加载到0000:7C00内存段(在早期的IBM-PC系统中,如果Int19执行失败后,会执行Int18调用Basic解释程序)。由于目前我们的系统还没有任何内容,因此,我们不得不借助已有操作系统的工具进行前面的工作。为了最贴近从零开始,我们只借助于dos中的debug工具。下面我们的第一步工作就是让系统在启动时不在报类似于“插入启动盘或无效的启动盘”之类的错误。目前,我们仅打算利用软盘实现系统的初期制作。由于软盘的0磁道0扇区会被加载到0000:7C00内存段,因此,我们可通过修改该扇区的内容达到编写自己的IPL程序的目的。通过验证,不难发现MBR的最后二个字节的值55AA并不是BIOS的要求,验证55AA是程序的责职。下面我们仅向0磁道0扇区写入两个字节(F4EBFD),其对应的汇编命令为:
Label: Hlt
Jmp label
重启虚拟机,并从软盘启动,一个带有光标闪烁的黑屏出现在我们的面前了。