Minimal Intel Architecture Boot Loader

今天看了一篇intel的白皮書感覺受益匪淺所以在網絡上把他記錄總結一下,白皮書的docment number is 323246

文章的寫作意圖是想寫一篇總結性文章來描述intel 平臺的系統啓動的順序,步驟以及要想自己寫一個在intel平臺上的BIOS所需要的一些技術性文章。

當一個新平臺要開發的時候可能會有2種開發狀況

1 開發一款BIOS

2 開發一款定製化的boot loader

2者的區別在於BIOS包含了所以的功能和配置,而boot loader只是爲特別的主板和特別的硬件使用

 

從reset開始初始化intel構架的平臺

    當IA bootstrap processor (BSP)  開機是它的執行的第一條地址是0xFFFFFFF0,也就是4G-16的位置,在這16 byte的位置通常放的是一條jump指令,讓cpu跳到其他地方去執行。

 

BY the way:CPU開機時處於Real Mode下,只能訪問1M的地址,地址FFFFFFF0h超過了1 MB的物理地址範圍。那麼CPU是如何訪問到的呢?要解釋這個問題我們就要從尋址開始說起,CPU要執行的指令地址都是放在base address:IP中,base address包含在CS中,CS寄存器被分爲兩部分:可見的“Segment Selector”部分和隱藏的"Base Address"部分,且base address = segment selector *16.

當CPU reset之後CPU的 segment selector 被初始化爲F000H,而Base Address則沒有按照上面的計算計算公式,而是直接被初始化爲了FFFF0000,所以CPU的第一條指令爲Base address +EIP=FFFF0000H + FFF0H =FFFFFFF0H了,

影射在地址FFFFFFF0h的代碼爲一條"far jump"或者"far call"指令或者產生一箇中斷,執行了jump 之後,CS的"Segment Selector"的值將會被改變,從而"Base Address"部分的值也將按照上述原則進行計算。

模式選擇

處理器必須處於以下的模式中:

實模式

保護模式

段保護模式

Refer to the Intel® 64 and IA-32 Architectures Software Developer’s Manual
Volume 3A section titled “Mode Switching” for more details.

(1)實模式

實模式是運行在16bit模式中,寄存器和代碼都是16bit。cpu執行的物理地址是通過SS<<4 + IP計算的,實模式只能訪問到1M的內存空間。

在實模式中,中斷處理是通過中斷向量表來處理的。

爲了支持傳統的操作系統,某些類型的實模式代碼必須在run-time提供來處理操作系統的需求,當然這個不在本文的討論範圍之內。

(2)保護模式

保護模式是運行在32位模式下的

Interrupt Descriptor Table (IDT)用於處理中斷。For more
information on the IDT, refer to the Intel® 64 and IA-32 Architectures
Software Developer’s Manual.

對Firmware來說這是被推薦的一種模式

(3)段保護模式

段保護模式的典型應用是和操作系統的分頁模式。

(4)處理器開始模式

當處理器剛開機時是處於一種特殊的模式類似於實模式,它的定端12位地址線被置爲高,所以就直接從FFFxxxxx的nvram位置開始訪問。Upon execution of the first long jump, these 12 address lines will be driven according to instructions by firmware. If one of the Protected Modes is not entered before the first long jump,處理器將進入實模式,有1M的方面空間。In order for Real Mode to work without memory, the chipset needs to be able to alias memory below 1MB to just below 4GB, to continue to access NVRAM. Some chipsets do not have this aliasing and a forcible switch to a normal operating mode will be required before performing the first long jump.

準備內存初始化

由於當前內存還沒有準備好,所以一下的代碼都是在rom上面執行,應爲rom比較慢所以這期間的代碼越少越好。

一下步驟執行讓系統準備好初始化內存:

 Processor Microcode Update
 Processor Initialization
 Chipset Initialization

(1)Processor Microcode Update
Refer to the Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A section titled “Microcode Update Facilities” for details on applying a processor microcode update.

(2)處理器初始化

 

...

(未完待續...)

 

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