0. BIOS經過讀取硬盤主引導扇區到內存,並跳轉到對應內存中的位置,也就是從’%cs=0 $pc=0x7c00‘進入並執行bootloader,bootloader要完成:數組
(1) 切換到保護模式,啓用分段機制;安全
(2) 讀取磁盤中的ELF執行文件格式的ucore操做系統到內存;函數
(3) 顯示字符串信息;spa
(4) 把控制權交給ucore操做系統;操作系統
對應於boot目錄下的 asm.h,bootasm.S,bootmain.c文件。bootasm.S的start函數文件是最早執行的,此函數進行了必定的初始化,完成從實模式到保護模式的轉換,並調用bootmain.c中的bootmain函數。bootmain函數實現了屏幕、串口和並口顯示字符串,加載ucore到內存,而後跳轉到ucore的入口處執行。asm.h中是bootasm.S所須要的頭文件,主要是一些與x86保護模式的段訪問方式相關的宏定義。3d
所謂實模式,是將整個物理內存當作分段的取餘,程序的數據和代碼位於不一樣區域,操做系統和用戶程序沒有區別對待,並且每一個指針都是指向實際的物理地址,若經過指針更改了操做系統或其餘用戶程序取餘,會帶來很大的災難,此模式下的80386只是一個快速的8086。指針
所謂保護模式,80386的所有32根地址線所有有效,可尋址高達4GB的線性地址空間和物理地址空間,可訪問64TB的邏輯地址空間,可採用分段存儲管理機制和分頁存儲管理機制,提供4個特權級和完善的特權檢查機制,既能實現資源共享又能保證代碼數據的安全及任務的隔離。blog
1. 初始化:內存
首先調用bootasm.S中的start函數進行初始化,屏蔽中斷,置位向量標誌位,置位幾個重要的段寄存器。資源
2. 開啓A20:
當A20地址線控制禁止時,程序就像運行在8086上,1MB以上的地址是不可訪問的,爲了使能全部地址位的尋址能力,必須向鍵盤控制器8082發送一個命令,鍵盤控制器8042會將A20線置於高電位,使所有32條地址線可用,實現訪問4GB內存。開啓A20的具體步驟以下:
(1) 等待8042 Input Buffer爲空。
(2) 發送Write 8042 Output Port (P2)命令到8042 Input Buffer。
(3) 等待8042 Input Buffer爲空。
(4) 將8042 Outpput Port (P2)獲得字節的第2位置1,而後寫入8042 Input Buffer。
具體實如今bootasm.S文件中:
3. 初始化全局描述符表:
爲了使分段存儲管理機制正常運行,須要創建好段描述符和段描述符表,全局描述符表是一個保存多個段描述符的「數組」,其起始地址保存在全局描述符表寄存器GDTR中。GDTR長48位,其中高32位爲基地址,低16位爲段界限。這裏只須要載入已經靜態存儲在引導區的GDT表和其描述符到GDTR寄存器:
4. 進入保護模式:
CR0的位0(PE)是啓用保護(Protection Enable)標誌。當設置該位時即開啓了保護模式;當復位時即進入實地址模式。這個標誌僅開啓段級保護,而並無啓用分頁機制。若要啓用分頁機制,那麼PE和PG標誌都要置位。因此這裏須要將cr0的PE位置1:
5. 經過長跳轉指令進入保護模式:
6. 置位段寄存器,創建堆棧:
7. 完成實模式到保護模式的轉換,調用bootmain.c中的bootmain函數: