馬柯帆,李寶峰,周悅錦,武園園,余永蘭,多瑞華
(國(guó)防科技大學(xué)計(jì)算機(jī)學(xué)院,湖南 長(zhǎng)沙 410073)
基板管理控制器BMC(Board Management Controller)通常用于管理含有多個(gè)大型處理器的服務(wù)器主板。主流的BMC可以運(yùn)行嵌入式Linux系統(tǒng),其Linux后臺(tái)運(yùn)行有ipmi、redfish、web、sol等BMC常用軟件,能與遠(yuǎn)程管理計(jì)算機(jī)進(jìn)行網(wǎng)絡(luò)通信,以便遠(yuǎn)程管理計(jì)算機(jī)控制和管理服務(wù)器的硬件。各主流服務(wù)器的BMC軟件棧均是閉源的,彼此兼容性差,影響了數(shù)據(jù)中心設(shè)備的統(tǒng)一管理[1]。OpenBMC是BMC的Linux發(fā)行版,該項(xiàng)目是由Microsoft、Intel、IBM、Google和Facebook等數(shù)據(jù)中心公司組織創(chuàng)立并開源的,且已轉(zhuǎn)入Linux基金會(huì)。OpenBMC使用Yocto Project作為設(shè)計(jì)編譯工具,并集成OpenEmbedded、systemd、D-Bus等技術(shù)來定制管理平臺(tái)。OpenBMC可以自由地添加ipmi、sol、web等BMC常用軟件包,且已自動(dòng)集成了RedFish,支持主板狀態(tài)查看和控制,以及主板固件更新等功能。RedFish是下一代數(shù)據(jù)中心管理標(biāo)準(zhǔn),由DMTF(Distributed Management Task Force)標(biāo)準(zhǔn)組織制定,用于替代當(dāng)前的ipmi。ipmi的缺點(diǎn)是功能較少、可擴(kuò)展性差,只適用于中小規(guī)模的數(shù)據(jù)中心管理。RedFish可擴(kuò)展性好、功能豐富,針對(duì)不同供應(yīng)商的種類多樣的基礎(chǔ)設(shè)施能夠提供規(guī)范化易集成的管理接口,除了服務(wù)器外,RedFish也在逐漸擴(kuò)展對(duì)存儲(chǔ)、網(wǎng)絡(luò)交換機(jī)方面的支持,可以滿足超大規(guī)模數(shù)據(jù)中心的復(fù)雜管理需求。
主流的BMC芯片一般是采用Nuvoton的NPCM7xxR系列、Aspeed的ASPxxx系列服務(wù)器。主板除了BMC之外,還有一塊FPGA芯片用于控制CPU的電源、復(fù)位時(shí)序。本文實(shí)現(xiàn)了將OpenBMC移植到Zynq-7000 All Programmable SoC芯片上,并通過擴(kuò)展UART(Universal Asynchronous Receiver/Transmitter)、IIC(Inter- Integrated Circuit)等常用接口,使得芯片既可以實(shí)現(xiàn)BMC的功能,又可以實(shí)現(xiàn)FPGA的相應(yīng)功能。
基本架構(gòu)設(shè)計(jì)如圖1所示,ZYNQ芯片通過AXI總線與AXI Uartlite、AXI IIC、AXI Quad SPI、AXI GPIO(General-Purpose Input/Output)等IP核相連。AXI Uartlite用于SOL(Serial Over LAN),AXI IIC用于監(jiān)控主板溫度以及電源芯片狀態(tài),AXI Quad SPI用于主板固件(BIOS、flash)更新,AXI GPIO用于控制主板加切電。ZYNQ芯片的ARM部分運(yùn)行OpenBMC Linux,添加ipmi、web、redfish等軟件,FPGA部分仍執(zhí)行相應(yīng)邏輯功能。
Figure 1 Basic architecture design圖1 基本架構(gòu)設(shè)計(jì)
ZYNQ系列異構(gòu)應(yīng)用處理器是XILINX在2010年發(fā)布的,該處理器將ARM Cortex-A9硬核IP與FPGA的可編程邏輯資源集成在一起,并通過ARM處理器的配置方式來啟動(dòng)FPGA。利用嵌入式資源同時(shí)完成圖形界面、DDR3控制、用戶輸入等任務(wù),可以通過FPGA資源實(shí)現(xiàn)并行處理,可以同時(shí)執(zhí)行多個(gè)計(jì)算單元,提供高性能的解決方案。ZYNQ芯片的體系結(jié)構(gòu)主要分為2部分:處理系統(tǒng)PS(Processing System)和可編程邏輯PL(Progarmmable Logic)。PS部分與ARM芯片架構(gòu)類似,主要包括一個(gè)雙核的ARM Cortex-A9處理器、片上存儲(chǔ)器、外部存儲(chǔ)器接口和大量的外圍接口。PL部分是可編程邏輯資源,它基于XILINX 7系列FPGA,由28 mm高k金屬柵極半導(dǎo)體技術(shù)制成。PS是系統(tǒng)中的主要部分,可以只使用PS,但是不可只用PL,因?yàn)镻L的配置下載需要PS進(jìn)行輔助。ZYNQ芯片的ARM處理器內(nèi)部帶有MMU(Memory Management Unit),可以運(yùn)行Linux。PL和PS之間的通信主要利用AXI片上總線,XILINX提供了很多帶AXI接口的IP核,可以靈活地應(yīng)用于各種應(yīng)用[2,3]。
Vivado是XILINX公司推出的一套FPGA開發(fā)工具,集成了FPGA設(shè)計(jì)和嵌入式設(shè)計(jì)等功能,它是一個(gè)基于AMBA AXI4 互聯(lián)規(guī)范、IP-XACT IP封裝元數(shù)據(jù)、工具命令語言TCL(Tool Command Language)、Synopsys 系統(tǒng)約束SDC(Synopsys Design Constraints)的開放式開發(fā)環(huán)境[4]。
一般來說,OpenBMC Linux的UBOOT、內(nèi)核、文件系統(tǒng)的生成以及設(shè)備樹的構(gòu)建有2種常規(guī)方法,即使用Petalinux或Yocto Project工具,這2種方法都可以一鍵得到所需文件。
Petalinux是XILINX公司推出的嵌入式Linux開發(fā)套件,包括了Linux內(nèi)核、UBOOT、設(shè)備樹、根文件系統(tǒng)、源碼、庫(kù)和Yocto recipes等[5],也可以讓客戶很方便地生成各種配置、編譯及自定義Linux發(fā)行版。PetaLinux工具支持的芯片系列有Zynq UltraScale+、MPSOC(Multi-Processor System On Chip)、Zynq 7000和MicroBlaze,可與Vivado協(xié)同工作,簡(jiǎn)化了Linux系統(tǒng)的開發(fā)工作。
Yocto Project是一個(gè)開源協(xié)作項(xiàng)目,能幫助開發(fā)者為不同硬件架構(gòu)的嵌入式產(chǎn)品制作基于Linux的定制系統(tǒng)。它提供了靈活的工具集和開發(fā)環(huán)境,使嵌入式設(shè)備開發(fā)人員能通過開源的軟件堆棧、配置文件來定制 Linux 映像,并在多個(gè)開發(fā)者一起協(xié)作上具有優(yōu)勢(shì)。Yocto Project 在系統(tǒng)和應(yīng)用程序開發(fā)、存檔和管理以及系統(tǒng)占用和內(nèi)存利用等方面都具有優(yōu)勢(shì)。Yocto使用BitBake工具來執(zhí)行Linux構(gòu)建任務(wù)。Yocto的優(yōu)點(diǎn)有:應(yīng)用廣泛、支持架構(gòu)多、靈活性高、軟件可裁減、更新穩(wěn)定以及生態(tài)系統(tǒng)豐富。但是,缺點(diǎn)是初始構(gòu)建時(shí)間長(zhǎng)、項(xiàng)目工作流程繁鎖、技術(shù)入門難、且各版本之間存在兼容性問題等。ZYNQ芯片支持使用Yocto Project構(gòu)建Linux系統(tǒng),XILINX官方已經(jīng)把相關(guān)代碼開源到github,并且OpenBMC官方推薦的開發(fā)工具也是Yocto Project。
ZYNQ芯片的邏輯設(shè)計(jì)主要是在Vivado開發(fā)工具上完成的。系統(tǒng)頂層設(shè)計(jì)如圖2所示,主要包括Processor System Reset、AXI Interconnect、AXI Interrupt Controller、AXI IIC、AXI Uartlite、AXI Quad SPI、AXI GPIO、Concat等模塊。
Processor System Reset是一種軟IP,它提供了一種用來處理其他IP核復(fù)位信號(hào)的機(jī)制,該IP核輸入端信號(hào)處理大量的復(fù)位需求,并在輸出端生成適當(dāng)?shù)膹?fù)位信號(hào)送給處理器,本文設(shè)計(jì)中用它來處理ZYNQ7 Processing System和帶AXI接口IP核的復(fù)位信號(hào)。
AXI Interconnect用其將AXI內(nèi)存映射主設(shè)備連接到AXI內(nèi)存映射從設(shè)備,可配置為多個(gè)主設(shè)備接口和多個(gè)從設(shè)備接口,這些AXI設(shè)備在數(shù)據(jù)寬度、時(shí)鐘域和AXI子協(xié)議(AXI4、AXI3或AXI4-Lite)方面可以不同,Vivado會(huì)執(zhí)行自動(dòng)推斷并轉(zhuǎn)換。在本文設(shè)計(jì)中,AXI Interconnect負(fù)責(zé)將ZYNQ7 Processing System主設(shè)備與各個(gè)AXI IP從設(shè)備互連起來,只需連好時(shí)鐘、復(fù)位、AXI信號(hào)即可,Vivado已經(jīng)將AXI信號(hào)并成一組,連接時(shí)會(huì)自動(dòng)識(shí)別。
AXI Interrupt Controller用于接收來自外圍設(shè)備的多個(gè)中斷輸入,并通過AXI總線將中斷信息送入到ZYNQ7 Processing System中進(jìn)行處理,可通過AXI接口訪問該IP核的各個(gè)寄存器(如使能中斷,應(yīng)答、校驗(yàn)等)。當(dāng)ARM端的中斷資源不夠用時(shí),可用它來擴(kuò)展中斷。
Concat IP核可以實(shí)現(xiàn)位拼接功能,本文設(shè)計(jì)中用其將各個(gè)外設(shè)IP的中斷信號(hào)拼接起來送到AXI Interrupt Controller。
電源時(shí)序控制模塊用于控制高性能服務(wù)器CPU的上電時(shí)序,此類CPU的供電需要多路電源芯片轉(zhuǎn)換得到,每路電源輸出都要按CPU廠商的要求進(jìn)行延時(shí)。其電源時(shí)序控制模塊設(shè)計(jì)及各信號(hào)定義如圖3所示,POWER_ON由AXI GPIO輸出的高低電平控制,當(dāng)POWER_ON由高電平控制時(shí),服務(wù)器電源使能信號(hào)CRPS_EN置為1’b1,CRPS電源就緒后會(huì)將CRPS_OK置為1’b1供FPGA判斷,其余各路電源按上電時(shí)序要求進(jìn)行使能和延時(shí)。
ZYNQ啟動(dòng)流程如圖4所示。ARM加載BootROM內(nèi)部程序,這個(gè)程序固化在ZYNQ內(nèi)部ROM,BootROM用于將第一階段啟動(dòng)程序FSBL(First Stage Boot Loader)加載到OCM(On Chip Memory),并啟動(dòng)FSBL。
Figure 4 Start process of ZYNQ圖4 ZYNQ啟動(dòng)流程
頂層設(shè)計(jì)完成后可導(dǎo)出一個(gè)硬件描述文件。Vivado SDK工具通過解析該硬件描述文件生成FSBL代碼和可執(zhí)行文件。UBOOT用于加載PL bitstream和啟動(dòng)Linux。PL bitstream的作用是配置FPGA。編譯完整個(gè)OpenBMC工程可生成u-boot.elf文件,通過Vivado SDK將u-boot.elf和FSBL,合并生成BOOT.bin文件[6],如圖5所示。
Figure 5 Merging and producing BOOT.bin file圖5 合并生成BOOT.bin文件
設(shè)備樹源碼的設(shè)計(jì)需要借助Vivado SDK,編譯設(shè)備樹則要用到OpenBMC配套的設(shè)備樹編譯程序。Vivado SDK根據(jù)XILINX提供的設(shè)備樹倉(cāng)庫(kù)來生成本文設(shè)計(jì)需要用到的設(shè)備樹源碼,倉(cāng)庫(kù)已經(jīng)在XILINX的Github上開源。創(chuàng)建設(shè)備樹版本的板級(jí)支持包后,Vivado SDK將自動(dòng)構(gòu)建生成pcw.dtsi、pl.dtsi、skeleton.dtsi、system-top.dts、zynq-7000.dtsi這幾個(gè)設(shè)備樹源碼文件。其中,在system-top.dts末尾添加溫度傳感器lm75節(jié)點(diǎn)并掛在axi_iic_0下。OpenBMC整個(gè)工程構(gòu)建完成后會(huì)生成設(shè)備樹編譯器可執(zhí)行文件dtc,利用dtc可以將設(shè)備樹源碼編譯為二進(jìn)制可加載dtb格式文件。
首先是開發(fā)環(huán)境的準(zhǔn)備。OpenBMC Linux部分設(shè)計(jì)要在Ubuntu環(huán)境下進(jìn)行,并要安裝好編譯用到的基本工具,例如:Ubuntu 20.04、GCC version 9.4.0、Python 3.8.10。涉及到ARM的交叉編譯工具不需要手動(dòng)安裝,Yocto Project工具會(huì)自動(dòng)根據(jù)配置文件執(zhí)行安裝程序。
OpenBMC Linux的設(shè)計(jì)是基于官方提供的開源倉(cāng)庫(kù)進(jìn)行修改的,其大概流程如圖6所示。
Figure 6 Design flow of OpenBMC Linux圖6 OpenBMC Linux設(shè)計(jì)流程
meta-xilinx里面包含了很多與硬件相關(guān)的內(nèi)容,需要手動(dòng)從XILINX的github倉(cāng)庫(kù)拉取下來,放到openbmc目錄里,并確保與meta-phosphor在同一個(gè)目錄。元數(shù)據(jù)包含了recipe、配置文件、構(gòu)建指令的信息以及自動(dòng)控制構(gòu)建的方法、也包含軟件版本信息及其來源、一系列補(bǔ)丁文件等。
添加machine之前要建立一個(gè)自己專用的層,文件名稱如圖7所示。其中的evb-zynq-zhou.conf就是machine配置,配置里面指定了使用的芯片的相關(guān)參數(shù),如:機(jī)器特征、UBOOT、串行控制臺(tái)、內(nèi)核設(shè)備樹、固件引導(dǎo)文件,除此之外的配置文件寫法可以參考meta-evb。
本文設(shè)計(jì)需要添加ipmitool、webui-vue這2個(gè)軟件包。ipmitool是一種命令行方式的 IPMI平臺(tái)管理工具,通過它可以實(shí)現(xiàn)獲取傳感器的信息、顯示系統(tǒng)日志內(nèi)容、網(wǎng)絡(luò)遠(yuǎn)程開關(guān)機(jī)等功能[7]。webui是網(wǎng)站用戶界面(Website User Interface),可以在網(wǎng)頁(yè)上顯示服務(wù)器的各種物理特征,如溫度、電壓、風(fēng)扇工作狀態(tài)及報(bào)警信息等。
SOL是指通過網(wǎng)絡(luò)會(huì)話來重新定向服務(wù)器CPU串口I/O的一種機(jī)制。SOL可以很好地幫助運(yùn)維人員找出服務(wù)器CPU啟動(dòng)失敗的原因,是BMC必不可少的一個(gè)功能[8]。OpenBMC中的SOL可以支持多個(gè)獨(dú)立CPU串口同時(shí)工作,其主要實(shí)現(xiàn)原理如圖8所示。配置傳感器建立的文件夾、文件、文件名及結(jié)構(gòu)如圖9所示。
Figure 8 Implementation principle of SOL圖8 SOL實(shí)現(xiàn)原理
Figure 9 Schematic diagram of sensor configuration files圖9 傳感器配置文件示意圖
配置內(nèi)核的目的是打開一些功能選項(xiàng)和增加Linux驅(qū)動(dòng),如增加ZNYQ頂層設(shè)計(jì)連接的AXI相關(guān)IP核驅(qū)動(dòng),需在內(nèi)核配置片段文件(.cfg)添加以下指令:
CONFIG_XILINX_INTC=y
CONFIG_IRQCHIP_XILINX_INTC_MODULE_ SUPPORT_EXPERIMENTAL=y
CONFIG_I2C_XILINX=y
CONFIG_SERIAL_UARTLITE=y
CONFIG_SERIAL_UARTLITE_CONSOLE=y
CONFIG_SENSORS_LM75=y
為了使引導(dǎo)加載Linux的過程變得更靈活,需設(shè)計(jì)UBOOT可運(yùn)行的scr腳本文件。新建文本文件boot_zhou.script,往文件中添加以下代碼:
fatload mmc 0 0x100000 bmc_zhou.bit
fpga loadb 0 0x100000 MYMfilesize
fatload mmc 0 0x00200000 uImage
fatload mmc 0 0x00900000 zynq-zybo-z7.dtb
fatload mmc 0 0x04000000 rootfs.cpio.gz.u-boot
bootm 0x00200000 0x04000000 0x00900000
命令表示從FAT格式的SD卡的0分區(qū)加載對(duì)應(yīng)的文件到相應(yīng)的內(nèi)存地址,再轉(zhuǎn)到相應(yīng)的地址啟動(dòng)系統(tǒng)。fpga loadb命令用于配置FPGA。
使用以下命令構(gòu)建OpenBMC工程:
.setup evb-zynq-zhou
bitbake -v -DDD obmc-phosphor-image
構(gòu)建完成后可在工程路徑下看到生成的各個(gè)固件文件。將BOOT.bin、rootfs.cpio.gz.u-boot、uImage、zynq-zybo-z7.dtb、boot.scr復(fù)制到FAT格式的SD卡。
硬件測(cè)試平臺(tái)如圖10所示。加電并連接串口后的顯示如圖11所示,出現(xiàn)登錄命令行表明OpenBMC Linux系統(tǒng)已經(jīng)啟動(dòng)完畢,輸入ipmitool sdr可以看到lm75溫度傳感器在正常工作。
Figure 10 Hardware test platform圖10 硬件測(cè)試平臺(tái)
將ZYNQ主板網(wǎng)線連至電腦,在電腦端的瀏覽器輸入網(wǎng)址https://BMC IP??梢园l(fā)現(xiàn),Web網(wǎng)頁(yè)能正常顯示,掛在AXI IIC下的lm75溫度傳感器狀態(tài)正常,如圖12所示。
Figure 12 Web page function test圖12 Web網(wǎng)頁(yè)功能測(cè)試
為了驗(yàn)證SOL功能,將ZYNQ板子上已經(jīng)綁定AXI Uartlite IP核的RX 引腳連到TX,保證電腦網(wǎng)絡(luò)與ZYNQ板子相通。串口回環(huán)測(cè)試如圖13所示,終端每發(fā)送一個(gè)字符都會(huì)接收到一個(gè)相同的字符。
為方便測(cè)試加電信號(hào),將POWOR_ON信號(hào)賦值給測(cè)試點(diǎn)POWOR_ON_TP,ZYNQ上執(zhí)行ipmi加電命令,測(cè)量POWOR_ON_TP信號(hào)引腳發(fā)現(xiàn)電平為高,說明電源控制正常,FPGA功能測(cè)試示意圖如圖14所示。
Figure 14 Schematic diagram of FPGA function test圖14 FPGA功能測(cè)試示意圖
本文提出了一種在ZYNQ芯片上實(shí)現(xiàn)OpenBMC的方法,介紹了從FPGA設(shè)計(jì)到OpenBMC Linux設(shè)計(jì)的整個(gè)流程。設(shè)計(jì)的OpenBMC Linux能成功編譯并運(yùn)行在ZYNQ芯片上,實(shí)現(xiàn)了溫度監(jiān)控、Web網(wǎng)頁(yè)顯示和 SOL等功能,可以根據(jù)不同的邏輯設(shè)計(jì)方案靈活地添加多路IIC、UART等接口,具有較高的可擴(kuò)展性。本文提出的設(shè)計(jì)方案,不僅實(shí)現(xiàn)了傳統(tǒng)的BMC監(jiān)控管理功能,同時(shí)也具有FPGA的高并行性和可擴(kuò)展性,可以一芯兩用,能夠極大地節(jié)省主板面積和物料成本,為高性能服務(wù)器、超算、交換機(jī)等日益嚴(yán)苛的設(shè)計(jì)環(huán)境提供一個(gè)理想的設(shè)計(jì)方案。