在實模式下開啟4GB的實體記憶體位址尋址(稱之為Big Real Mode)
- 通過A20快速門(Fast Gate)修改0x90端口的資料, 對其進行置位(類似于打開一個開關), 開啟
- 使用CLI彙編指令關閉外部中斷
- 使用lgdt加載保護模式需要的系統資料結構
- 置位cr0寄存器的值開啟保護模式
- 進入保護模式
- 重新加載FS寄存器中的資料, 使其支援4GB的實體記憶體位址的尋址
- 立刻置位cr0寄存器的資料關閉保護模式
- 使用STI彙編指令開啟外部中斷
- 這樣CPU就可以支援4GB的尋址了
- 注意: 該Big Real Mode是必須的, 我們需要将核心代碼加載到1MB以上的實體記憶體位址空間上, 那麼就需要開啟4GB的記憶體尋址, 之是以要在傳回到實模式是因為在實模式下所有記憶體位址都是可以通路的, 而在保護模式下則不能, 在這裡我們需要通路一些實體位址是以需要在傳回實模式
完成了核心代碼的加載和移動到指定的1MB之上的位置之後的模式切換
- 在Big Real Mode中已經開啟了A20快速門開關, 這裡就不需要了
- 手動初始化好gdt資料結構(包括: 段描述符(資料段和代碼段), 段選擇子(用來索引資料段和代碼段), gdt的基位址和長度(這個通過lgdt彙編指令加載到gdtr寄存器中))
- 手動初始化好idt資料結構
- 使用lgdt将上面定義好的資料結構的基位址和長度加載到寄存器中
- 置位(PE)cr0寄存器的值開啟保護模式
- 進入保護模式, 以0特權級别執行指令
- 使用jmp指令将CPU指向保護模式的代碼
- CPU執行保護模式的代碼
- 緊接着要進入到IA-32e模式(64位), 必須要使用一個jmp跳轉指令才能進入保護模式, 這是規定
進入IA-32e模式
- 判斷CPU是否支援IA-32e模式, 如果支援則(見下面的步驟)
- 手動初始化64位的gdt
- 重新加載gdt, lgdt 到gdtr中
- 置位cr0寄存器的資料關閉分頁機制PG
- 置位cr4寄存器的資料PAE開啟實體位址擴充功能(PAE)
- 置位IA32_EFER寄存器的LME标志位開啟IA-32e模式
- 置位cr0寄存器的資料開啟分頁機制PG
- 使用jmp将CPU指向核心代碼
- 執行完畢jmp指令時候才會進入到IA-32e模式, 是以上面的跳轉指令的位址還是基于分段機制的