初始化協議處理器 CPU多核初始化

2021-10-18 01:52:03 字數 1968 閱讀 5049

最近的幾個專案都不止一次的碰到了mp 初始化的問題,每次都花了不少的時間,於是打算總結一下多處理器初始化的流程,以備將來再次碰到的問題時方便查詢。 mp初始化指的是在乙個有至少2個或者多個處理器的系統裡,怎麼去初始化所有的處理器,讓系統工作起來。ia-32 arch 定義了mp 初始化的協議,該協議使得ia-32,x64的mp系統都可以boot,並且並不需要多餘的特定的訊號,或者指定特定的bsp.

mp初始化協議演算法: 在bsp,ap選出以後,通常bsp的初始化順序為:

通常ap的初始化順序為:

在mp 初始化協議演算法裡有幾個關鍵的機制,1. apic (ipi,apic id,svr) 2. atomic operation and spin lock,需要專門的介紹一下:

apic 是高階可程式設計中斷控制器,每個cpu都有乙個。有兩種模式apic和x2apic(支援更多的中斷)mode。在mp初始化的過程中,我們需要enable apic,svr(0xfee000f0)暫存器的bit8是用來en/disable它的

apic id是每個處理器的編號,是有microcode生成的然後寫apicid暫存器中,通常是8bits。 bsp一般都是0

inter-processor interrupt(ipi)是處理器間傳遞訊息的機制,bsp會給ap發init ipi和sipi。實現的機制是通過bsp去program apic中的icr暫存器去發ipi. destination field 通常填的就是apic id

原子操作原子操作在mp過程中在在計數器等地方,這類情況下資料有併發的危險,但是用鎖去保護又顯得有些浪費,所以使用原子型別操作。x86處理器提供了lock prefix可以幫住解決這樣的場景。

lock inc   dword [edi]

lock dec dword [rax] ; (*counttofinish)--

自旋鎖是專為防止多處理器併發而引入的一種鎖,它在應用於中斷處理等部分(對於單處理器來說,防止中斷處理中的併發可簡單採用關閉中斷的方式,不需要自旋鎖)。 自旋鎖最多只能被乙個任務持有,如果乙個processor任務試圖請求乙個已被爭用(已經被持有)的自旋鎖,那麼這個任務就會一直進行忙迴圈——旋轉——等待鎖重新可用。 要是鎖未被爭用,請求它的processor任務便能立刻得到它並且繼續進行。自旋鎖可以在任何時刻防止多於乙個的核心任務同時進入臨界區,因此這種鎖可有效地避免多處理器上併發執行的核心任務競爭共享資源。

structspinlock ;

voidspin_lock(structspinlock*lock) {

while(lock->locked||test_and_set(&lock->locked)); //atomic operation

voidspin_unlock(structspinlock*lock) {

lock->locked=0;

refer:

ARM處理器系統初始化過程

arm處理器系統初始化過程 每次系統上電 復位啟動時,處理器都處於一種最低效能即只有最基本功能的狀態,此時它只能從復位向量位址處去讀取指令,其他功能模組都處於禁止或者不可預知狀態,而一旦處理器從復位向量位址位置讀取到第一條指令開始執行,那麼從軟體的角度看,處理器和整個系統就開始進入了軟體可控狀態,系...

物件初始化器和集合初始化器

c 語言開發團隊在c 3.0中增加了乙個名為 物件初始化器 object initializer 的特性 它能初始化乙個物件中的所有允許訪問的字段和屬性。別以為這和你沒關係。我們先來看乙個你非常熟悉不過的 user operator new user operator.id 1 operator.p...

物件初始化器與集合初始化器

物件初始化器 使用物件初始化器,可以在建立時直接向物件賦值,無需顯示的呼叫物件的建構函式。利用這個技術可發人員可以建立匿名型別,顯著的減少編寫物件初始化語句的 new p 不採用物件初始化器寫的 user new user user.id 1 user.pwd 123 user.name 孫悟空 採...