计算机BIOS读取硬盘第一个扇区的数据到内存0x7C00位置,将控制权交给主引导记录(MBR),MBR再搜索系统的活动分区表,加载活动分区表的第一个扇区到一个固定的地址。MBR接下来将控制权交给PBR,PBR解析FAT或NTFS格式文件系统,找到引导内核的文件NTLDR,将该文件加载到0x20000。最后将控制权交给NTLDR进行内核启动。
原版的启动源码是一段汇编程序,这段汇编程序的路径大概是在“\boot\freeldr\bootsect\dosmbr.asm”。
我这里参考的源码不是原版ReactOS,这里的参考源码是源于《Windows内核设计思想》作者陈树宝改写的精简版BMR启动源码。我查看了原版DOSMBR代码,它的代码更加接近于Windows XP的启动逻辑。陈树宝的版本更加易于理解。下面给出陈树宝的代码片段:
start:
cli ; 关中断,将标志寄存器中的中断标志位清零,禁止中断;
xor ax, ax ; 异或运算,两个操作数相同,即清零运算;
mov ss, ax ; 设置栈段寄存器,段寄存器清零;
mov sp, 7c00h ; 设置栈顶,栈顶为0x7C00;
sti ; 开中断,将标志寄存器中的中断标志位置1,开启中断;
push 07c0h
pop ds
mov ax, 07c0h ; 设置数据段寄存器
mov ds, ax
; 加载NTLDR
push dword 80000h/512-8 ; count - ntldr扇区总数,80000h / 512 - 8 = 0x3F8
push dword 8 ; src - 开始读取的扇区号
push dword 20000h ; des - 存放数据的目的地址
call LoadSector ; 加载扇区
;ntfsboot jmp 0x2000:0000,fatboot jmp 0x2000:0003
push word 2000h
push word 0000h
o16 retf
未完待续…