計算機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
未完待續…