1. 程式人生 > >揭秘英特爾處理器如何啟動?

揭秘英特爾處理器如何啟動?

因此 processor roc 權限管理 物理地址 c語言 我們 應用 地址空間

  英特爾處理器是怎樣運行的?當我們打開計算機時,它會在能夠加載操作系統之前經過一系列步驟。在這篇文章中,我們將看到典型的x86處理器如何啟動。這是一個非常復雜且涉及的過程。我們只提出一個基本的整體結構。此外,處理器實際上采用何種路徑來達到可以加載OS的狀態,這取決於引導固件。

技術分享圖片

  施加電源之前

  讓我們從BIOS芯片開始,也稱為引導ROM。BIOS芯片是計算機主板上的一塊矽片,它可以存儲字節。它有兩個我們感興趣的特征。首先,它(或其中的一部分)是內存映射到CPU的地址空間,這意味著CPU可以像訪問RAM一樣訪問它。特別是,CPU可以將其指令指針指向BIOS芯片內的執行代碼。其次,BIOS芯片存儲的字節代表CPU執行的第一個指令。BIOSchop還包含其他代碼和數據。典型的BIOS包含閃存描述符(BIOS芯片的內容表),BIOS區域(要執行的第一條指令),IntelME(Intel管理引擎)和GbE(千兆以太網)。

  通電時

  現代英特爾芯片配備了所謂的英特爾管理引擎。只要有電源-通過電池或電源-IntelME就會出現。它執行自己的初始化,要求它讀取BIOS的閃存描述符以查找IntelME區域的位置,然後從BIOS的IntelME區域讀取代碼和配置數據。接下來,當我們按下計算機上的電源按鈕時,CPU會亮起。在多處理器系統上,始終存在一個名為BootstrapProcessor(BSP)的指定處理器。在任何一種情況下,處理器總是以所謂的16位實模式啟動,其中insruction指針指向地址0xffff.fff0,即復位向量。在此初始模式下,處理器有前12個地址線被斷言,因此任何地址都看起來像0xfffx.xxxx。

技術分享圖片

  BIOS芯片也以這樣的方式設置,即從BIOS執行的第一條指令位於處理器的物理地址0xffff.fff0。因此,處理器能夠從BIOS芯片的BIOS區域執行第一條指令。該區域包含所謂的引導固件。引導固件的示例是UEFI實現,coreboot和經典BIOS。

  引導固件的第一件事就是切換到32位模式。它也是“保護模式”,即打開分段,並且可以使用不同的訪問權限管理處理器地址空間的各個段。然而,啟動固件只有一個段,有效地關閉了分段。這稱為平面模式。

  早期的初始化

  值得註意的是,在啟動過程的這一點上,DRAM不可用。DRAM初始化是啟動固件的主要目標之一。但在它初始化DRAM之前,它需要做一些準備。

  微代碼補丁就像CPU正常運行的補丁。英特爾不斷發布針對不同CPU的微碼補丁。引導固件在引導過程中很早就應用了這些補丁。處理器的一部分是所謂的sout橋接器或I/O控制器集線器(ICH)或外圍控制器集線器(PCH)。ICH也有一些初步措施。例如,ICH可能包含一個看門狗定時器,可以關閉哪個DRAM正在初始化。必須首先關閉該看門狗定時器。

技術分享圖片

?  當然所有這些都是由某人編寫的代碼固件完成的。現在我們知道的大多數代碼都使用堆棧。但我們已經提到DRAM尚未初始化,因此沒有內存。那麽這段代碼是如何編寫和運行的呢?答案是這是無堆棧代碼。要麽它是手寫的x86匯編,要麽就像coreboot一樣,它是用C語言編寫的,並使用稱為ROMCC的特殊編譯器進行編譯,該編譯器將C轉換為無堆棧匯編指令。這當然有一些限制,所以ROMCC編譯代碼不是我們想要執行的所有內容。我們需要盡快堆疊。(歡迎轉載分享)

揭秘英特爾處理器如何啟動?