本文選自極術(shù)專欄《IC設(shè)計(jì)》的文章,授權(quán)轉(zhuǎn)自微信公眾號(hào)老秦談芯。本篇將介紹多核處理器的啟動(dòng)過(guò)程。
在早些年前,一個(gè)中央處理器(CPU)里面只有一個(gè)處理器核(Core)。那時(shí)候CPU的性能提升主要靠的是提升處理器工作主頻。定性分析,我們假定一個(gè)軟件在編譯完成后,對(duì)應(yīng)的需要執(zhí)行的指令總數(shù)是固定的,那么處理器主頻越高,執(zhí)行這些指令用的時(shí)間越少,也就是處理器的性能越高。定量分析,處理器的性能公式:CPU時(shí)間 = IC x CPI x時(shí)鐘周期時(shí)間,其中IC是指令的條數(shù),CPI是每時(shí)鐘周期指令數(shù)。從上述公式可以看出提升CPU性能可以從三方面入手:時(shí)鐘頻率,CPI 和指令的條數(shù)。
隨著集成電路的發(fā)展,人們發(fā)現(xiàn)提高處理器主頻越來(lái)越難以實(shí)現(xiàn)了。那么,能不能把原來(lái)的一個(gè)任務(wù)分解成多個(gè)子任務(wù)并行執(zhí)行,這樣是不是就會(huì)提升處理器的性能呢?在前面我們講過(guò),雖然現(xiàn)在的處理器有了操作系統(tǒng)加持,看起來(lái)能夠并行執(zhí)行很多個(gè)不同的程序。但是實(shí)際上在某一段時(shí)間內(nèi),一個(gè)處理器核只能執(zhí)行一個(gè)程序,操作系統(tǒng)只是通過(guò)時(shí)間片輪轉(zhuǎn)的方式讓所有的程序分時(shí)執(zhí)行,看起來(lái)像所有程序并行執(zhí)行一樣。那如果有很多個(gè)處理器核,每個(gè)核執(zhí)行一個(gè)程序,是不是會(huì)提升整體性能呢?這兩個(gè)問(wèn)題的答案都是肯定的。有了多核處理器,就可以并行執(zhí)行多個(gè)程序,也可以并行執(zhí)行一個(gè)程序(前提是這個(gè)程序可拆解)。對(duì)于并行執(zhí)行的性能提升,定量分析可以參考Amdahl定律。
不管單核處理器還是多核處理器設(shè)計(jì),都是一個(gè)非常宏大的話題。以上只是泛泛而談,不再展開(kāi)。我們今天具體看看處理器的啟動(dòng)過(guò)程。在分析多核處理器啟動(dòng)之前,我們先來(lái)看看一個(gè)單核的計(jì)算機(jī)系統(tǒng)是如何啟動(dòng)的。假設(shè)大家對(duì)內(nèi)存管理,TLB,緩存(Cache),DDR,PCIe這些有一些基礎(chǔ)知識(shí)。
當(dāng)我們按下電源開(kāi)關(guān)以后,系統(tǒng)的時(shí)鐘生成單元會(huì)最先工作,這時(shí)候處在參考時(shí)鐘ref_clk下(通常是10-100MHz),待到PLL輸出穩(wěn)定后,時(shí)鐘生成單元會(huì)把給處理器的時(shí)鐘切換到正常工作頻率,并釋放處理器的復(fù)位信號(hào),通常我們稱這個(gè)復(fù)位為冷復(fù)位。
無(wú)論采用何種指令系統(tǒng)的處理器, 復(fù)位后的第一條指令都會(huì)從一個(gè)預(yù)先定義的特定地址取回。處理器的執(zhí)行就從這條指令開(kāi)始。處理器的啟動(dòng)過(guò)程, 實(shí)際上就是一個(gè)特定程序的執(zhí)行過(guò)程。這個(gè)程序我們稱為BIOS(Basic Input Output System, 基本輸入輸出系統(tǒng)),也有稱為Bootloader,或者統(tǒng)統(tǒng)歸為固件(Firmware)?,F(xiàn)代計(jì)算機(jī)系統(tǒng)的啟動(dòng)代碼很復(fù)雜了,但是本文是從硬件角度去分析,所以就不嚴(yán)格區(qū)分這幾個(gè)軟件概念了。
處理器預(yù)先定義的起始地址會(huì)在系統(tǒng)總線中映射到一個(gè)存儲(chǔ)設(shè)備上,這個(gè)設(shè)備可能是內(nèi)部的ROM,也可能是外部Flash。如果把處理器從開(kāi)始到結(jié)束比作一場(chǎng)大戲,啟動(dòng)過(guò)程就是序幕,那么現(xiàn)在才剛剛開(kāi)始準(zhǔn)備工作。
當(dāng)CPU拿到第一條指令,啟動(dòng)過(guò)程就開(kāi)始了。所謂啟動(dòng)初始化過(guò)程,就是把計(jì)算機(jī)系統(tǒng)內(nèi)部每個(gè)模塊的工作狀態(tài)調(diào)整到一個(gè)確定的狀態(tài),其實(shí)就是一個(gè)熵減的過(guò)程?,F(xiàn)在的處理器設(shè)計(jì)大都是基于Load/Store架構(gòu),所以簡(jiǎn)單說(shuō),初始化過(guò)程就是處理器通過(guò)一大堆的load和store指令把復(fù)位后某些沒(méi)有固定態(tài)的寄存器或者模塊設(shè)置到固定態(tài)(嚴(yán)格意義上,這么說(shuō)不十分準(zhǔn)確)。
處理器啟動(dòng)后的第一條指令的地址一定是實(shí)地址,或者說(shuō)是直接地址翻譯模式(虛地址和實(shí)地址有直接的對(duì)應(yīng)關(guān)系)下的地址,因?yàn)檫@時(shí)候的TLB還沒(méi)有被初始化,尚不能正常工作。這時(shí)候的指令或數(shù)據(jù)訪問(wèn)是uncacheable的,也就是不經(jīng)過(guò)高速緩存,原因一樣,高速緩存還沒(méi)有被初始化。
在初始化過(guò)程的前期,一般最先初始化調(diào)試接口,通常是UART串口。這樣做的好處是在早期就可以提供一個(gè)簡(jiǎn)單的交互接口,如果后面的初始化過(guò)程跑不下去了,也能進(jìn)行簡(jiǎn)單的調(diào)試。通常情況下,I/O設(shè)備的寄存器會(huì)跟內(nèi)存空間映射到一起,也就是所謂的memory mapped方式,這樣處理器可以像訪問(wèn)內(nèi)存空間一樣去訪問(wèn)這些I/O設(shè)備(我們先不考慮某些系統(tǒng)中可以通過(guò)特殊指令訪問(wèn)I/O設(shè)備的做法)。
調(diào)試接口的初始化完成后,就是TLB初始化。TLB作為一個(gè)地址映射的管理模塊,主要負(fù)責(zé)操作系統(tǒng)里地址空間的管理。系統(tǒng)剛上電時(shí),TLB里的內(nèi)容是殘留或者隨機(jī)的,換句話說(shuō),TLB里面的所有表項(xiàng)都是錯(cuò)誤的。TLB的初始化主要是將全部表項(xiàng)初始化為無(wú)效,將TLB的每項(xiàng)逐一清空, 以免程序中使用的地址被未初始化的TLB表項(xiàng)所錯(cuò)誤映射。這個(gè)過(guò)程可以由硬件完成,也可以由軟件完成(通過(guò)特殊指令),不同指令集的處理器有不同的方式。
同理,在系統(tǒng)復(fù)位之后,Cache同樣也處于一個(gè)未經(jīng)初始化的狀態(tài), 也就是說(shuō)Cache里面可能包含殘留的或隨機(jī)的數(shù)據(jù), 如果不經(jīng)初始化, 對(duì)于Cache空間的訪問(wèn)也可能會(huì)導(dǎo)致錯(cuò)誤的命中。大多數(shù)情況下對(duì)Cache的初始化就是對(duì)Tag的初始化,只要將其中的Cache塊狀態(tài)設(shè)置為無(wú)效, 其它部分的隨機(jī)數(shù)據(jù)就不會(huì)產(chǎn)生影響?,F(xiàn)在的處理器設(shè)計(jì)中,緩存系統(tǒng)大多數(shù)情況下會(huì)采用分層結(jié)構(gòu),對(duì)于多核處理器,一般L1緩存是獨(dú)享的,最后一級(jí)緩存是共享的。不管單核處理器系統(tǒng)還是多核處理器系統(tǒng),都要對(duì)所有層級(jí)的緩存做初始化。
接下來(lái)就是內(nèi)存的初始化了,在此步驟之前的代碼執(zhí)行要么是處理器直接讀ROM/Flash里面的指令,要么是把外部存儲(chǔ)器的讀到芯片內(nèi)部RAM,處理器從RAM讀取指令。不管哪種方式,處理器執(zhí)行的速度都會(huì)比較慢。內(nèi)存控制器的初始化包括兩個(gè)相對(duì)獨(dú)立的部分, 一是根據(jù)內(nèi)存的行地址、列地址等對(duì)內(nèi)存地址映射進(jìn)行配置, 二是根據(jù)協(xié)議對(duì)內(nèi)存信號(hào)調(diào)整的支持方式對(duì)內(nèi)存讀寫(xiě)信號(hào)相關(guān)的寄存器進(jìn)行訓(xùn)練(Training), 以保證傳輸時(shí)的數(shù)據(jù)完整性。 內(nèi)存初始化完成后,就要對(duì)外部設(shè)備進(jìn)行初始化,首先要完成的是外部設(shè)備的探測(cè)和加載。這部分主要是指PCIe的訓(xùn)練,設(shè)備枚舉,并加載驅(qū)動(dòng)等動(dòng)作。這也是一個(gè)比較大的話題,不展開(kāi)了。
至此,為了加載操作系統(tǒng)的基本環(huán)境已完成,可以進(jìn)入操作系統(tǒng)內(nèi)核了。單核處理器的啟動(dòng)初始化過(guò)程也就結(jié)束了。
對(duì)于多核處理器系統(tǒng),情況復(fù)雜一些。一般是有一個(gè)主核(有時(shí)叫core 0)先去完成上述的操作。主核的啟動(dòng)工作完成后,再去喚醒其它的處理器核(可以稱為從核)。從核負(fù)責(zé)初始化私有的TLB和cache等資源,啟動(dòng)之后進(jìn)入空閑(Idle)狀態(tài),直至進(jìn)入操作系統(tǒng)再由主核進(jìn)行調(diào)度。多核處理器的內(nèi)核間通信一般會(huì)通過(guò)信箱(Mailbox)機(jī)制或者核間中斷機(jī)制。信箱機(jī)制可以是設(shè)計(jì)專用的信箱寄存器,主要是為了在內(nèi)存還沒(méi)有初始化前就讓所有處理器核能夠有效通。如果是通過(guò)信箱機(jī)制,從核在等待喚醒的時(shí)候要去定時(shí)查詢自己的信箱寄存器,如果發(fā)現(xiàn)主核喚醒自己,就要從空閑狀態(tài)出來(lái)了??梢钥闯?,信箱寄存器機(jī)制需要處理器輪詢,所以通信效率不高,在休眠/喚醒這類不頻繁的操作中還可以,如果是比較頻繁的核間通信就不適用了,要采取中斷機(jī)制。
以上是多核處理器啟動(dòng)的基本原理,至于具體實(shí)現(xiàn),不同的廠商有不同的設(shè)計(jì)。比如在ARM體系里面,往往會(huì)有一個(gè)小的系統(tǒng)控制單元(MSCP,Management & System Control Processor)輔助完成簡(jiǎn)單外設(shè)初始化,安全認(rèn)證等等工作,然后由主核和從核完成剩余的啟動(dòng)工作。
責(zé)任編輯:彭菁
-
電源開(kāi)關(guān)
+關(guān)注
關(guān)注
12文章
1030瀏覽量
44439 -
程序
+關(guān)注
關(guān)注
116文章
3756瀏覽量
80751 -
多核處理器
+關(guān)注
關(guān)注
0文章
109瀏覽量
19889
原文標(biāo)題:多核處理器啟動(dòng)過(guò)程淺析
文章出處:【微信號(hào):Ithingedu,微信公眾號(hào):安芯教育科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論