?

多核系統中提升啟動速度之策略

2014-12-07 06:18
電子技術應用 2014年3期
關鍵詞:內核隊列串口

王 江

(上海貝爾股份有限公司N&P,上海 201206)

快速啟動能力是衡量產品性能的一個重要指標。無論是消費類電子產品(例如手機、電腦、電視機),還是專業的通信電子設備(例如示波器、網關、服務器),啟動速度快無疑能給用戶留下美好的第一印象。雖然電子設備的“心臟”越來越多地選用了多核處理器,但是目前大部分啟動代碼還停留在單內核處理器的思維框架中,沒有能夠充分利用多內核處理器的長處,而越來越多的外部器件卻在另一方面悄悄地延長了啟動時間。

為了彌補這一不足,突破傳統單核啟動的思維框架,本文以一個典型的嵌入式系統為例,對加快系統啟動速度進行了研究。

1 典型的系統架構和啟動過程

1.1 系統架構

智能通信電子產品的典型架構是以CPU(中央處理器)為核心,根據產品需求輔以內存、硬盤、網卡、USB、串口等各種外設,如圖1所示。

圖1 系統結構框圖

系統的核心是飛思卡爾(FreeScale)公司開發的32位PowerPC架構處理器MPC8572E[1],主頻最高可達1.333 GHz。芯片集成了2個完全相同的高性能e500內核,每個內核各包含32 KB一級指令緩存和32 KB一級數據緩存。芯片還集成了豐多彩富的內部功能模塊和外設接口,包括:2個內核共享的 1 MB容量的二級緩存、2個 64位DDR2/DDR3內存控制器、1個可編程的中斷控制器、1個安全引擎、2個I2C總線控制器、2個異步串口控制器、1個增強型本地總線控制器、4個支持10/100/1 000 MB/s的以太網接口、3個符合PCIe 1.0a標準的PCIe接口等。

CPU、內存、閃存、串口和網口組成了一個常見的最小系統,其他模塊則是錦上添花。處理器通過PCIe接口連接 SATA/SAS控制器(例如 LSI公司的 SAS2008芯片),再外接SATA/SAS硬盤。實時時鐘芯片(RTC)和溫度感應器通過I2C總線與處理器相連。FPGA用于輔助CPU工作。這個系統具有強大的處理能力和靈活的可擴展性,適合于路由器、網關等多種應用場合。其他智能電子設備的控制系統的架構也大致如此,只是CPU可能替換成ARM、MIPS或x86等體現結構的處理器,外圍器件有所增減,但是總體框架和啟動過程大同小異。

1.2 啟動過程

該系統由業界常用的U-BOOT[2]引導啟動。圖2顯示了多內核處理器系統中啟動代碼的工作流程。上電或重啟后,內核0根據配置引腳的設定,選擇從閃存中讀取啟動代碼。其他內核保持Reset狀態。內核0依次初始化了e500內核、第一個串口、一級數據緩存和指令緩存、二級緩存、I2C總線設備、內存。因為初始化內存時CPU需要訪問內存條上的SPD(SPD是存儲內存條規格參數的EEPROM芯片),所以I2C總線的初始化必須在內存初始化之前完成。之所以較早地初始化串口,是為了盡早建立人機交互的環境,以方便用戶判斷系統啟動到各個階段的狀態。然后,內核從閃存中讀取FPGA配置文件并且下載到FPGA芯片中,再初始化PCIe設備、網口、SAS/SATA控制器、硬盤和文件系統。接著,內核0釋放其他內核的Reset信號。

圖2 典型系統啟動流程

其他內核也從閃存中讀取啟動代碼,依次初始化e500內核、一級數據緩存和指令緩存,然后通過共享內存的方式(也可以通過內部寄存器或者內核間中斷等方式)通知內核0“我準備就緒了?!币坏﹥群?0發現其他內核準備就緒后,就從硬盤中讀取操作系統的鏡像文件,校驗正確后加載執行。如果內核0發現其他內核啟動失敗,則重新發出Reset信號,要求其他內核重復初始化的過程。

經過測試,整個系統的啟動時間約9 s。表1列舉了耗時超過0.1 s的模塊,其他模塊的耗時微乎其微,可以忽略不計。從啟動過程可以看出,所有的初始化任務基本上都由內核0承擔,總的啟動時間是各模塊初始化時間的總和。顯然,這種傳統的多核啟動方式沒有利用多內核的優勢,還停留在單核啟動的框架中。

表1 主要啟動模塊耗時統計

2 啟動過程的改進

在多核系統中,為了高效地利用多個核的并行工作,啟動代碼的設計需要從傳統意義上的任務串行機制轉換到任務并行機制,并且要注重多內核間的協作。改進后的啟動方案不僅充分利用了多內核的優勢,將一些模塊的初始化任務分配給了其他內核,而且優化了一些模塊的初始化方法,建立了內核間有效的通信機制。

如何將模塊分配給其他內核初始化,分配原則之一是獨立性。如果該模塊和其他模塊沒有相互依賴關系,則可以將該模塊分配給其他內核加載。原則之二是耗時的模塊盡量分配給不同的內核加載,即每個核承擔模塊的總耗時盡量平均,盡可能減少等待時間。據此優化為圖3所示的啟動流程。

圖3 優化后的啟動流程

啟動過程中,內核0仍然扮演主力隊員的角色,首先初始化e500、串口、一級緩存和二級緩存,然后只初始化一部分內存,而不是全部內存。這一部分內存姑且稱為基本內存,即啟動代碼所要用到的內存,本系統中是32 MB。因為內存的初始化比較費時,主要時耗不在內存控制器的初始化上,而在于將所有的4 GB內存清零,所以把內存劃分為一大一小兩部分初始化,將容量大的那部分內存分配給其他內核初始化,有利于提升整體的啟動速度。

完成內核、串口1和基本內存的初始化之后,內核0先把啟動代碼從閃存復制到內存中,再釋放其他內核的Reset信號。其他內核立刻初始化e500內核和內嵌的一級緩存,然后通知內核0“我已經準備好了?!眱群?得知其他內核準備就緒了,就開始分配其余的初始化任務。其他內核依次初始化剩余的大部分內存,下載FPGA的配置文件,初始化網口,最后等待操作系統。與此同時,內核0初始化PCIe設備、SAS/SATA控制器及磁盤,加載文件系統,最后從磁盤中讀入操作系統文件,計算校驗和,引導操作系統的啟動。

除了改進啟動流程之外,充分利用硬件特性,優化一些模塊的初始化方法和工作機制,設計高效的內核間通信機制,也可以提升啟動速度。

(1)內存初始化。內存初始化的主要耗時動作是清零。目前主流的處理器都集成了DMA(直接存儲器訪問)引擎,DMA引擎就是為了降低CPU負載而設計的。測試發現,與處理器直接清零內存操作比較,采用DMA方式,速度可以提升一倍。并且,在DMA引擎清零的同時,CPU還可以承擔其他工作,例如下載FPGA配置文件。此外,如果內存設置為交織模式,其吞吐量可以翻番,從而減少耗時,進一步提升啟動速度。

(2)PCIe初始化。PCIe[3]總線在軟件上兼容PCI、PCI-x總線,PCI或者PCI-x器件可以通過PCIe橋設備連接到PCIe的總線拓撲中。PCIe總線的拓撲結構像一顆樹,最多允許擁有256條總線,每條總線上最多允許32個設備,每個設備上最多可集成8個功能模塊。一般采用深度遞歸算法,從根節點出發,遍歷整棵樹,找到存在的有效設備并初始化。初始化的操作就是分配總線號、設備號、中斷號和地址空間等。其中,PCIe拓撲結構的遍歷過程是比較耗時的一個操作。

實際上,對于電子產品而言,一旦電路板裝配好了,除了PCIe插槽上的設備未定之外,其他PCIe設備都固定了,是已知數,所以對于已知設備可以省略掃描這個步驟。它的相關信息可以存儲在閃存的指定區域,啟動代碼直接從這個區域讀取。如果電路板上沒有PCIe插槽,則整個PCIe拓撲結構的信息都可以保存在閃存中,徹底省略了遍歷過程,耗時微乎其微。對于插槽上的未定設備,深度遍歷的出發點可以從根節點出發改為從各個PCIe插槽出發,大幅縮小遍歷范圍,從而節省了大量時間。

(3)簡單高效的基于共享內存的內核間通信機制。內核之間為了緊密配合,相互間需要傳遞一些命令和數據,雖然有些處理器擁有特別的內核間的通信方式,例如博通公司XLR系統處理器的消息環機制[4](Message Ring),但是共享內存是一個比較通用的方法,不僅適合于內核之間,也適合于處理器之間以及處理器與外設之間的通信,可移植性較強?;诠蚕韮却?,設計一個簡單高效的通信機制,有助于內核0與其他內核之間命令的上行下達。

因為啟動過程中內核0起主導作用,所以在內核0和其他每個內核之間都創建了一條通信通道,組成一個星形結構:內核0在中間,其他內核在四周,如圖4所示。每條通道由收、發2個隊列組成:內核0只能寫發送隊列,其他內核只能讀發送隊列;接收隊列的操作相反,內核0只能讀接收隊列,其他內核只能寫接收隊列。

圖4 基于共享內存的通信機制

讀寫隊列的基本單位是數據塊,即每次從隊列中讀取一個或多個數據塊,或者往隊列中寫入一個或多個數據塊。數據塊由序列號、命令、數據長度、數據等域組成。發送隊列數據塊中的序列號是偶數,而接收隊列數據塊的序列號是奇數,每一個發送數據塊都對應一個響應的接收數據塊,它們的序列號相差1。發送隊列數據塊中的數據域是與命令相關的參數,接收隊列數據塊中的數據域是命令的執行結果。

借助這個收發隊列通信機制,內核0可以便捷地把初始化等任務分派給其他內核并得到反饋,有利于系統的可擴展性。例如系統中增加了一個新器件,內核0可以把新器件的初始化工作分配給一個比較空閑的內核,從而最大限度地減少對整個啟動時間的影響。

經過啟動流程的改進、模塊加載和初始化方式的優化、內核間高效通信機制的設計等工作,系統的啟動時間大約縮短了50%,達到了比較滿意的結果。目前多處理器的發展和應用如火如荼,希望本文所介紹的經驗對各種體系結構的多內核處理器的啟動代碼設計都有所幫助。

[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.

猜你喜歡
內核隊列串口
多內核操作系統綜述①
強化『高新』內核 打造農業『硅谷』
淺談AB PLC串口跟RFID傳感器的通訊應用
隊列里的小秘密
基于多隊列切換的SDN擁塞控制*
基于嵌入式Linux內核的自恢復設計
Linux內核mmap保護機制研究
在隊列里
豐田加速駛入自動駕駛隊列
數字電源內部數據傳輸的串口通信方法實現
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合