ReactOS源碼分析——內核加載器(一)

計算機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

未完待續…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章