文獻標識碼: A
文章編號: 0258-7998(2014)03-0025-04
快速啟動能力是衡量產(chǎn)品性能的一個重要指標,。無論是消費類電子產(chǎn)品(例如手機,、電腦、電視機),,還是專業(yè)的通信電子設備(例如示波器,、網(wǎng)關、服務器),,啟動速度快無疑能給用戶留下美好的第一印象,。雖然電子設備的“心臟”越來越多地選用了多核處理器,但是目前大部分啟動代碼還停留在單內核處理器的思維框架中,,沒有能夠充分利用多內核處理器的長處,,而越來越多的外部器件卻在另一方面悄悄地延長了啟動時間。
為了彌補這一不足,,突破傳統(tǒng)單核啟動的思維框架,,本文以一個典型的嵌入式系統(tǒng)為例,對加快系統(tǒng)啟動速度進行了研究,。
1 典型的系統(tǒng)架構和啟動過程
1.1 系統(tǒng)架構
智能通信電子產(chǎn)品的典型架構是以CPU(中央處理器)為核心,,根據(jù)產(chǎn)品需求輔以內存、硬盤,、網(wǎng)卡,、USB、串口等各種外設,,如圖1所示,。
系統(tǒng)的核心是飛思卡爾(FreeScale)公司開發(fā)的32位PowerPC架構處理器MPC8572E[1],主頻最高可達1.333 GHz,。芯片集成了2個完全相同的高性能e500內核,,每個內核各包含32 KB一級指令緩存和32 KB一級數(shù)據(jù)緩存。芯片還集成了豐多彩富的內部功能模塊和外設接口,,包括:2個內核共享的1 MB容量的二級緩存,、2個64位DDR2/DDR3內存控制器、1個可編程的中斷控制器,、1個安全引擎,、2個I2C總線控制器、2個異步串口控制器,、1個增強型本地總線控制器,、4個支持10/100/1 000 MB/s的以太網(wǎng)接口,、3個符合PCIe 1.0a標準的PCIe接口等。
CPU,、內存,、閃存、串口和網(wǎng)口組成了一個常見的最小系統(tǒng),,其他模塊則是錦上添花,。處理器通過PCIe接口連接SATA/SAS控制器(例如LSI公司的SAS2008芯片),再外接SATA/SAS硬盤,。實時時鐘芯片(RTC)和溫度感應器通過I2C總線與處理器相連,。FPGA用于輔助CPU工作。這個系統(tǒng)具有強大的處理能力和靈活的可擴展性,,適合于路由器,、網(wǎng)關等多種應用場合。其他智能電子設備的控制系統(tǒng)的架構也大致如此,,只是CPU可能替換成ARM,、MIPS或x86等體現(xiàn)結構的處理器,外圍器件有所增減,,但是總體框架和啟動過程大同小異,。
1.2 啟動過程
該系統(tǒng)由業(yè)界常用的U-BOOT[2]引導啟動。圖2顯示了多內核處理器系統(tǒng)中啟動代碼的工作流程,。上電或重啟后,,內核0根據(jù)配置引腳的設定,選擇從閃存中讀取啟動代碼,。其他內核保持Reset狀態(tài)。內核0依次初始化了e500內核,、第一個串口,、一級數(shù)據(jù)緩存和指令緩存、二級緩存,、I2C總線設備,、內存。因為初始化內存時CPU需要訪問內存條上的SPD(SPD是存儲內存條規(guī)格參數(shù)的EEPROM芯片),,所以I2C總線的初始化必須在內存初始化之前完成,。之所以較早地初始化串口,是為了盡早建立人機交互的環(huán)境,,以方便用戶判斷系統(tǒng)啟動到各個階段的狀態(tài),。然后,內核從閃存中讀取FPGA配置文件并且下載到FPGA芯片中,,再初始化PCIe設備,、網(wǎng)口,、SAS/SATA控制器、硬盤和文件系統(tǒng),。接著,,內核0釋放其他內核的Reset信號。
其他內核也從閃存中讀取啟動代碼,,依次初始化e500內核,、一級數(shù)據(jù)緩存和指令緩存,然后通過共享內存的方式(也可以通過內部寄存器或者內核間中斷等方式)通知內核0“我準備就緒了,。”一旦內核0發(fā)現(xiàn)其他內核準備就緒后,,就從硬盤中讀取操作系統(tǒng)的鏡像文件,校驗正確后加載執(zhí)行,。如果內核0發(fā)現(xiàn)其他內核啟動失敗,,則重新發(fā)出Reset信號,要求其他內核重復初始化的過程,。
經(jīng)過測試,,整個系統(tǒng)的啟動時間約9 s。表1列舉了耗時超過0.1 s的模塊,,其他模塊的耗時微乎其微,,可以忽略不計。從啟動過程可以看出,,所有的初始化任務基本上都由內核0承擔,,總的啟動時間是各模塊初始化時間的總和。顯然,,這種傳統(tǒng)的多核啟動方式?jīng)]有利用多內核的優(yōu)勢,,還停留在單核啟動的框架中。
2 啟動過程的改進
在多核系統(tǒng)中,,為了高效地利用多個核的并行工作,,啟動代碼的設計需要從傳統(tǒng)意義上的任務串行機制轉換到任務并行機制,并且要注重多內核間的協(xié)作,。改進后的啟動方案不僅充分利用了多內核的優(yōu)勢,,將一些模塊的初始化任務分配給了其他內核,而且優(yōu)化了一些模塊的初始化方法,,建立了內核間有效的通信機制,。
如何將模塊分配給其他內核初始化,分配原則之一是獨立性,。如果該模塊和其他模塊沒有相互依賴關系,,則可以將該模塊分配給其他內核加載。原則之二是耗時的模塊盡量分配給不同的內核加載,,即每個核承擔模塊的總耗時盡量平均,,盡可能減少等待時間,。據(jù)此優(yōu)化為圖3所示的啟動流程。
啟動過程中,,內核0仍然扮演主力隊員的角色,,首先初始化e500、串口,、一級緩存和二級緩存,,然后只初始化一部分內存,而不是全部內存,。這一部分內存姑且稱為基本內存,,即啟動代碼所要用到的內存,本系統(tǒng)中是32 MB,。因為內存的初始化比較費時,,主要時耗不在內存控制器的初始化上,而在于將所有的4 GB內存清零,,所以把內存劃分為一大一小兩部分初始化,,將容量大的那部分內存分配給其他內核初始化,有利于提升整體的啟動速度,。
完成內核,、串口1和基本內存的初始化之后,內核0先把啟動代碼從閃存復制到內存中,,再釋放其他內核的Reset信號,。其他內核立刻初始化e500內核和內嵌的一級緩存,然后通知內核0“我已經(jīng)準備好了,。”內核0得知其他內核準備就緒了,,就開始分配其余的初始化任務。其他內核依次初始化剩余的大部分內存,,下載FPGA的配置文件,,初始化網(wǎng)口,最后等待操作系統(tǒng),。與此同時,內核0初始化PCIe設備,、SAS/SATA控制器及磁盤,,加載文件系統(tǒng),最后從磁盤中讀入操作系統(tǒng)文件,,計算校驗和,,引導操作系統(tǒng)的啟動。
除了改進啟動流程之外,,充分利用硬件特性,,優(yōu)化一些模塊的初始化方法和工作機制,,設計高效的內核間通信機制,也可以提升啟動速度,。
(1)內存初始化,。內存初始化的主要耗時動作是清零。目前主流的處理器都集成了DMA(直接存儲器訪問)引擎,,DMA引擎就是為了降低CPU負載而設計的,。測試發(fā)現(xiàn),與處理器直接清零內存操作比較,,采用DMA方式,,速度可以提升一倍。并且,,在DMA引擎清零的同時,,CPU還可以承擔其他工作,例如下載FPGA配置文件,。此外,,如果內存設置為交織模式,其吞吐量可以翻番,,從而減少耗時,,進一步提升啟動速度。
(2)PCIe初始化,。PCIe[3]總線在軟件上兼容PCI,、PCI-x總線,PCI或者PCI-x器件可以通過PCIe橋設備連接到PCIe的總線拓撲中,。PCIe總線的拓撲結構像一顆樹,,最多允許擁有256條總線,每條總線上最多允許32個設備,,每個設備上最多可集成8個功能模塊,。一般采用深度遞歸算法,從根節(jié)點出發(fā),,遍歷整棵樹,,找到存在的有效設備并初始化。初始化的操作就是分配總線號,、設備號,、中斷號和地址空間等。其中,,PCIe拓撲結構的遍歷過程是比較耗時的一個操作,。
實際上,對于電子產(chǎn)品而言,一旦電路板裝配好了,,除了PCIe插槽上的設備未定之外,,其他PCIe設備都固定了,是已知數(shù),,所以對于已知設備可以省略掃描這個步驟,。它的相關信息可以存儲在閃存的指定區(qū)域,啟動代碼直接從這個區(qū)域讀取,。如果電路板上沒有PCIe插槽,,則整個PCIe拓撲結構的信息都可以保存在閃存中,徹底省略了遍歷過程,,耗時微乎其微,。對于插槽上的未定設備,深度遍歷的出發(fā)點可以從根節(jié)點出發(fā)改為從各個PCIe插槽出發(fā),,大幅縮小遍歷范圍,,從而節(jié)省了大量時間。
(3)簡單高效的基于共享內存的內核間通信機制,。內核之間為了緊密配合,,相互間需要傳遞一些命令和數(shù)據(jù),雖然有些處理器擁有特別的內核間的通信方式,,例如博通公司XLR系統(tǒng)處理器的消息環(huán)機制[4](Message Ring),,但是共享內存是一個比較通用的方法,不僅適合于內核之間,,也適合于處理器之間以及處理器與外設之間的通信,,可移植性較強?;诠蚕韮却?,設計一個簡單高效的通信機制,有助于內核0與其他內核之間命令的上行下達,。
因為啟動過程中內核0起主導作用,,所以在內核0和其他每個內核之間都創(chuàng)建了一條通信通道,組成一個星形結構:內核0在中間,,其他內核在四周,,如圖4所示。每條通道由收,、發(fā)2個隊列組成:內核0只能寫發(fā)送隊列,,其他內核只能讀發(fā)送隊列;接收隊列的操作相反,,內核0只能讀接收隊列,其他內核只能寫接收隊列。
讀寫隊列的基本單位是數(shù)據(jù)塊,,即每次從隊列中讀取一個或多個數(shù)據(jù)塊,,或者往隊列中寫入一個或多個數(shù)據(jù)塊。數(shù)據(jù)塊由序列號,、命令,、數(shù)據(jù)長度、數(shù)據(jù)等域組成,。發(fā)送隊列數(shù)據(jù)塊中的序列號是偶數(shù),,而接收隊列數(shù)據(jù)塊的序列號是奇數(shù),每一個發(fā)送數(shù)據(jù)塊都對應一個響應的接收數(shù)據(jù)塊,,它們的序列號相差1,。發(fā)送隊列數(shù)據(jù)塊中的數(shù)據(jù)域是與命令相關的參數(shù),接收隊列數(shù)據(jù)塊中的數(shù)據(jù)域是命令的執(zhí)行結果,。
借助這個收發(fā)隊列通信機制,,內核0可以便捷地把初始化等任務分派給其他內核并得到反饋,有利于系統(tǒng)的可擴展性,。例如系統(tǒng)中增加了一個新器件,,內核0可以把新器件的初始化工作分配給一個比較空閑的內核,從而最大限度地減少對整個啟動時間的影響,。
經(jīng)過啟動流程的改進,、模塊加載和初始化方式的優(yōu)化、內核間高效通信機制的設計等工作,,系統(tǒng)的啟動時間大約縮短了50%,,達到了比較滿意的結果。目前多處理器的發(fā)展和應用如火如荼,,希望本文所介紹的經(jīng)驗對各種體系結構的多內核處理器的啟動代碼設計都有所幫助,。
參考文獻
[1] FreeScale Semiconductor.MPC8572E PowerQUICC III integrated processor hardware specifications,Rev.5[Z].2011.
[2] DENK W.The universal boot loader[EB/OL].[2013-07]. http://www.denx.de/wiki/DULG/WebHome.
[3] PCISIG.PCI Express base specification,,revision 3.0[Z]. 2008.
[4] Broadcom Inc..XLR processor family data sheet,,revision 2.00[Z].2008.