UEFI國產(chǎn)計算機平臺BIOS研討

時間:2022-06-04 04:03:00

導(dǎo)語:UEFI國產(chǎn)計算機平臺BIOS研討一文來源于網(wǎng)友上傳,不代表本站觀點,若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。

UEFI國產(chǎn)計算機平臺BIOS研討

1概述

傳統(tǒng)BIOS有著諸多的弊端,使得系統(tǒng)維護(hù)代價大,阻礙了國內(nèi)計算機技術(shù)的發(fā)展。uefi提供了標(biāo)準(zhǔn)化的BIOS規(guī)范,為計算機系統(tǒng)的擴展和升級提供了方便,同時也使得系統(tǒng)引導(dǎo)更為迅速、對操作系統(tǒng)引導(dǎo)器以及操作系統(tǒng)本身的限制大大減少。隨著龍芯等國產(chǎn)高性能處理器芯片的研發(fā)成功及穩(wěn)定性增強,國內(nèi)陸續(xù)展開了許多基于國產(chǎn)CPU的計算機系統(tǒng)研究開發(fā)工作。計算機系統(tǒng)中BIOS是連接硬件和軟件的關(guān)鍵組件,也是系統(tǒng)安全性驗證的重要環(huán)節(jié),然而長期以來,BIOS技術(shù)基本被國外幾家廠商掌控,給計算機系統(tǒng)的安全埋下了安全隱患。UEFI已經(jīng)在國外諸多知名計算機廠商中得到廣泛的認(rèn)可和使用,它的推廣和應(yīng)用也使得國產(chǎn)BIOS的研究和開發(fā)成為可能,國產(chǎn)計算機平臺上的UEFIbios研究是國產(chǎn)BIOS發(fā)展的要求,也是提高計算機系統(tǒng)安全性的需要,基于國產(chǎn)計算機平臺的UEFIBIOS研究具有十分重要的意義?;诖?,本文研究基于UEFI的國產(chǎn)計算機平臺BIOS。

2龍芯國產(chǎn)計算機平臺簡介

本文的硬件平臺是一款自主研發(fā)的龍芯2F處理器計算機平臺,其邏輯結(jié)構(gòu)如圖1所示。龍芯處理器自帶內(nèi)存控制器,支持最高容量2GB的DDR2內(nèi)存,處理器通過PCI總線與南橋、以太網(wǎng)控制器、顯卡相連,向外提供最多3個PCI設(shè)備擴展。通過南橋向外提供2路RS232接口、4路USB接口、1路數(shù)字音頻接口、1路IDE接口和1路LPC接口;通過以太網(wǎng)控制器向外提供兩路千兆以太網(wǎng)口;通過顯卡提供LVDS和VGA2種顯示接口。Flash通過LocalBUS與CPU連接。該平臺原先使用PMON作為BIOS。PMON是MIPS處理器最常使用的BIOS,最新版本為PMON2000,支持MIPS、ARM、PPC和X86體系結(jié)構(gòu),可以從Flash、IDE、網(wǎng)絡(luò)以及USB啟動操作系統(tǒng),包含調(diào)試系統(tǒng),支持多種調(diào)試命令,使用串口作為輸出。

3UEFIBIOS的優(yōu)勢

可擴展固件接口(ExtensibleFirmwareInterface,EFI)首先由Intel為解除傳統(tǒng)BIOS對安騰處理器體系結(jié)構(gòu)性能的限制而提出,后交由國際標(biāo)準(zhǔn)化組織UEFI管理,改名為統(tǒng)一可擴展固件接口(UnifiedExtensibleFirmwareInterface,UEFI)。UEFIBIOS的執(zhí)行流程如圖2所示,它一般包括SEC(security)、PEI(pre-EFIInitialization)、DXE(DriverExecutionEnvironment)、BDS(BootDeviceSelect)4個階段,SEC執(zhí)行系統(tǒng)基本初始化,準(zhǔn)備C語言執(zhí)行環(huán)境;PEI階段進(jìn)入C代碼環(huán)境,描述系統(tǒng)資源和初始化信息,結(jié)束后傳遞給DXE階段;DXE階段對計算機系統(tǒng)設(shè)備進(jìn)行初始化和配置,構(gòu)建系統(tǒng)表,提供對資源的訪問接口;BDS階段為BIOS引導(dǎo)的最后階段,完成進(jìn)入操作系統(tǒng)引導(dǎo)前的準(zhǔn)備工作,最終加載OSLoader,系統(tǒng)控制權(quán)交給OSLoader,僅保留運行時服務(wù)可為系統(tǒng)使用[1-2]。至此,UEFIBIOS對系統(tǒng)的控制結(jié)束。

UEFI具有模塊化結(jié)構(gòu)、C語言風(fēng)格、EFI驅(qū)動模型硬件操作方式等優(yōu)點。下面分別從可移植性、開機速度、可擴展性、操作界面4個方面對PMON和龍芯國產(chǎn)計算機平臺的UEFI固件兩者進(jìn)行比較:

(1)開機速度PMON會對它發(fā)現(xiàn)的所有掛到主板上的設(shè)備進(jìn)行驅(qū)動加載和執(zhí)行,因此掛載設(shè)備的多少直接影響到系統(tǒng)的引導(dǎo)啟動速度;UEFI設(shè)備驅(qū)動遵循UEFI驅(qū)動模型,DXE階段不會對該類型的驅(qū)動進(jìn)行更多的初始化工作,直到BDS中調(diào)用EFI_DRIVER_BINDING_PROTOCOL中的start()將該驅(qū)動與設(shè)備控制器連接并初始化設(shè)備[3],在BDS階段設(shè)置界面中可對這些設(shè)備進(jìn)行選擇以及調(diào)整啟動順序,某些啟動時不需要的設(shè)備可以推遲到后階段進(jìn)行初始化和配置,從而提高系統(tǒng)引導(dǎo)速度。

(2)可移植性PMON與UEFIBIOS一樣由C語言編寫,使用輪詢方式發(fā)現(xiàn)設(shè)備驅(qū)動。PMON中與平臺硬件相關(guān)的部分分布不規(guī)則,移植工作量較大,且要求開發(fā)者對代碼結(jié)構(gòu)了解程度高;UEFI的模塊化結(jié)構(gòu)以及標(biāo)準(zhǔn)的硬件操作接口使得驅(qū)動與核心控制代碼之間耦合度低,移植時只需修改這些標(biāo)準(zhǔn)接口的實現(xiàn),而不影響其上層或者其他平行模塊,所以,UEFI可移植性要遠(yuǎn)優(yōu)于PMON。UEFI的標(biāo)準(zhǔn)硬件操作接口即一組DXEArchitecturalProtocols[2],它們屏蔽底層硬件細(xì)節(jié),使得UEFIBIOS具有高可移植性。

(3)可擴展性PMON中添加驅(qū)動或者功能時需在初始化流程中添加對相應(yīng)設(shè)備或者功能的調(diào)用,編程者需要十分熟悉整個代碼的結(jié)構(gòu)和調(diào)用位置;UEFIBIOS中設(shè)備驅(qū)動符合EFIDriverModel,BIOS核心代碼會發(fā)現(xiàn)并加載驅(qū)動,不需要編程者關(guān)注核心代碼。同時UEFI對PCI總線體系結(jié)構(gòu)的支持也體現(xiàn)了其良好的可擴展特性。UEFIPCI總線驅(qū)動采用分層結(jié)構(gòu),從下至上包括PCIRootBridge、PCIBUS和PCI設(shè)備驅(qū)動三層[1],關(guān)于總線的大部分初始化和配置工作在硬件相關(guān)的HostBridge驅(qū)動中實現(xiàn),PCI設(shè)備驅(qū)動程序的實現(xiàn)與平臺PCI體系結(jié)構(gòu)無關(guān),總線結(jié)構(gòu)發(fā)生改變時,也僅需對PciHostBridge進(jìn)行改變。

(4)操作界面PMON通過shell命令行提供大量的命令和功能使系統(tǒng)與用戶進(jìn)行交互,包括網(wǎng)絡(luò)通信、讀寫內(nèi)存、在線燒寫Flash等存儲設(shè)備等等;UEFIBIOS在BDS階段可進(jìn)入shell界面,與PMON不同的是,用戶能自定義UEFI應(yīng)用程序,它們不影響固件核心程序,在shell中加載運行,圖形界面中還可選擇加載UEFI應(yīng)用程序?qū)ο到y(tǒng)進(jìn)行檢測或者修復(fù)工作,或者管理系統(tǒng)信息、配置啟動選項,UEFIshell是一種應(yīng)用程序。國產(chǎn)計算機平臺的UEFIBIOS是國產(chǎn)化BIOS發(fā)展的需要,針對國產(chǎn)計算機平臺的不同結(jié)構(gòu)和應(yīng)用場合,其BIOS的實現(xiàn)和維護(hù)也更加方便。固件運行階段可使用外部設(shè)備,并擁有圖形化設(shè)置界面,支持從除Flash之外的位置加載固件模塊,同時操作系統(tǒng)的啟動位置和方式的選擇也更加靈活。還可以開發(fā)功能豐富的UEFI應(yīng)用程序,操作系統(tǒng)中某些功能或者機制的實現(xiàn)可以在固件中實現(xiàn),例如固件層電源管理功能[4]、固件層數(shù)據(jù)備份和恢復(fù)[5]等,解決了這些關(guān)鍵機制過分依賴于操作系統(tǒng)的問題,使得國產(chǎn)計算機系統(tǒng)更為可靠。

4固件設(shè)計與實現(xiàn)

本文BIOS的實現(xiàn)以EDKII框架為基礎(chǔ),EDKII是遵循UEFI規(guī)范的開源框架,它包含了大量開發(fā)示例和基本的底層庫函數(shù),這些代碼中一部分與平臺體系結(jié)構(gòu)無關(guān),另一部分則與硬件結(jié)構(gòu)關(guān)系密切。實現(xiàn)BIOS首先分析出必須實現(xiàn)的模塊,屬于EDKII通用部分的模塊則直接使用,平臺相關(guān)部分的則必須針對硬件細(xì)節(jié)進(jìn)行修改,最后添加EDKII中沒有提供參考實現(xiàn)或者實例的功能模塊,組成一個能在平臺上運行并且使平臺能正常工作的代碼集合。遵循UEFI模塊化的特點,除EDKII中直接被使用的通用代碼外,其余修改或者自定義編寫模塊包含在一個獨立的包(package)中,它與ArmPkg、BeaglePkg等目錄平行,并按照執(zhí)行流程進(jìn)行劃分。BIOS的實現(xiàn)內(nèi)容如圖3所示,可以大致劃分為3大部分,如圖中虛線框所示,在包中體現(xiàn)為3個子目錄。圖3BIOS實現(xiàn)內(nèi)容

4.1EDKII簡介

EDKII中各基本模塊的依賴關(guān)系如圖4所示,其主要模塊的功能如下:(1)BaseTools:包含代碼編譯所需的二進(jìn)制編譯工具集和編譯環(huán)境配置文件。(2)MdePkg:包含各個平臺通用的基本的底層庫函數(shù)、協(xié)議和工業(yè)標(biāo)準(zhǔn),各種平臺架構(gòu)的UEFIBIOS都可以在模塊中引用這些庫函數(shù),有效減少了開發(fā)工作量。(3)MdeModulePkg:包含一系列各平臺通用的模塊,其中包括MdePkg中公共庫的應(yīng)用模塊示例。(4)Conf:保存編譯環(huán)境信息、編譯目標(biāo)路徑以及編譯器參數(shù),工具將在該路徑下產(chǎn)生3個配置文件。(5)EdkShellPkg、ShellPkg:提供一個平臺通用的UEFIShell應(yīng)用程序開發(fā)環(huán)境。(6)EdkFatBinPkg:包含針對不同CPU架構(gòu)的原始FAT驅(qū)動。(7)Nt32Pkg:一個在Windows操作系統(tǒng)下可加載32位模擬器,提供UEFI運行環(huán)境的平臺。UnixPkg是Linux操作系統(tǒng)下的模擬環(huán)境。(8)ArmPkg、ArmPlatformPkg:針對ARM平臺的實現(xiàn),與具體平臺硬件相關(guān)。相應(yīng)的ArmRealViewPkg、EmbeddedPkg、Omap35xxPkg分別是在ArmRealView、嵌入式、Omap35xx平臺上的參考實現(xiàn)。(9)NetWorkPkg、UefiCpuPkg:網(wǎng)絡(luò)、CPU驅(qū)動參考實現(xiàn)。(10)DuetPkg:提供基于傳統(tǒng)BIOS運行環(huán)境的支持庫。(11)OptionRomPkg:提供針對不同CPU架構(gòu)編譯PCI兼容映像的示例。

4.2固件實現(xiàn)

固件以模塊為單位,每個模塊實現(xiàn)若干功能的集合。各模塊之間的依賴關(guān)系在模塊的配置文件(.inf)中進(jìn)行定義,并通過包中的配置文件DEC(packagedeclarationfile)、DSC(builddescriptionfile)和FDF(FlashDescriptionFile)選擇需要編譯到BIOS中的代碼、對PCD和變量賦值描述內(nèi)存空間等資源的分配以及描述二進(jìn)制代碼在Flash上的布局。本文使用0x80000000~0x90000000的一段空間作為系統(tǒng)內(nèi)存,其分配情況如圖5所示。代碼編譯時,編譯器解析配置文件將指定的代碼按照指定的結(jié)構(gòu)生成二進(jìn)制可執(zhí)行文件。

4.2.1SEC和PEI

SEC和PEI是UEFIBIOS中最先執(zhí)行的2個階段,UEFI中關(guān)于PEI的設(shè)計類似于一個微型DXE,它執(zhí)行的操作應(yīng)該盡量的少。本文中將SEC和PEI的功能作為一個模塊實現(xiàn),不采用規(guī)范中的PEI的(加載器-PEI模塊)結(jié)構(gòu),該模塊分為2個部分。(1)系統(tǒng)上電后的執(zhí)行起點,負(fù)責(zé)對系統(tǒng)硬件進(jìn)行檢測以及系統(tǒng)內(nèi)存、cache、堆棧空間的基本初始化,為之后C語言代碼準(zhǔn)備執(zhí)行環(huán)境。調(diào)試時通常要使用串口輸出信息,龍芯國產(chǎn)計算機平臺通過南橋向外提供串口,因此該階段還需初始化北橋、南橋、串口。這部分采用MIPS匯編語言實現(xiàn),完成基本的初始化之后調(diào)用第2階段的C語言部分入口函數(shù)。(2)使用C語言實現(xiàn),其任務(wù)包括將BIOS拷貝到內(nèi)存以加快執(zhí)行速度(shadowFlash),硬件的復(fù)雜初始化,PCI地址空間映射,構(gòu)建HOBList并將其交給DXE。本文不實現(xiàn)標(biāo)準(zhǔn)PEI結(jié)構(gòu),而是使用EDKII中MdePkg/Library/BasePeCoffLib以及EmbeddedPkg/Library/PrePiLib中提供的關(guān)于二進(jìn)制映像、HOBList、內(nèi)存的操作來完成PEI的主要功能。最后,通過過渡函數(shù)查找并調(diào)用DXE入口函數(shù)。

4.2.2DXE

DXE階段負(fù)責(zé)系統(tǒng)引導(dǎo)中主要初始化工作,分為核心和驅(qū)動兩部分。核心創(chuàng)建各種服務(wù)和接口供其他模塊使用,驅(qū)動則提供對硬件的操作、初始化設(shè)備以及實現(xiàn)對各種機制的支持。(1)核心DXE核心建立在一系列對硬件的抽象接口之上,不依賴于CPU、芯片組等特定平臺相關(guān)細(xì)節(jié),其實現(xiàn)沒有平臺差異。EDKII/MdeModulePkg/Core/Dxe是DXE核心模塊,包括DXEDispatcher和DXEFoundation,分別負(fù)責(zé)按順序加載驅(qū)動和創(chuàng)建各種服務(wù)。在保證DXE核心所必須的功能完整的情況下,根據(jù)需求對其中某些部分進(jìn)行增、刪、改,如添加debug代碼,即可作為固件的DXE核心部分。(2)驅(qū)動DXE驅(qū)動是固件實現(xiàn)的重要部分,它可以是平臺硬件和外部設(shè)備的驅(qū)動程序,或者支持特定功能和機制的模塊。它分為兩種類型:早期DXE驅(qū)動和UEFI驅(qū)動模型驅(qū)動[2]。對于不同的平臺,驅(qū)動的類型、數(shù)量均有差異,可以由程序員重新編寫,也可以通過修改EDKII中包含的大量驅(qū)動的參考實來獲得需要的設(shè)備驅(qū)動,從而節(jié)省編碼時間,規(guī)范代碼風(fēng)格使其便于閱讀。首先分析平臺體系結(jié)構(gòu),實現(xiàn)對CPU、芯片組、計時器等板級設(shè)備以及總線等平臺底層硬件操作的驅(qū)動,添加固件內(nèi)部實現(xiàn)機制支持的驅(qū)動,這些驅(qū)動將創(chuàng)建DXE架構(gòu)協(xié)議,提供抽象接口。這部分驅(qū)動屬于早期DXE驅(qū)動,它們最終產(chǎn)生出所有的DXE服務(wù)、啟動服務(wù)、運行時服務(wù),后續(xù)執(zhí)行的程序使用這些服務(wù)進(jìn)行平臺底層操作,不直接與硬件交互。其次根據(jù)需要連接的外部設(shè)備確定要添加的設(shè)備驅(qū)動程序,這些模塊遵循UEFI驅(qū)動模型。鍵盤、鼠標(biāo)、顯卡、網(wǎng)卡以及其他PCI設(shè)備驅(qū)動都通過這種方式加載。本文硬件平臺總線包括PCI、USB、IDE。遵循UEFI總線驅(qū)動的風(fēng)格,它們的驅(qū)動都分為3個層次,包括控制器驅(qū)動、BUS驅(qū)動以及設(shè)備驅(qū)動,當(dāng)總線體系結(jié)構(gòu)發(fā)生改變時,只需對控制器驅(qū)動層進(jìn)行適配。PCI驅(qū)動主要實現(xiàn)PCIHostBridge、PCIBUS驅(qū)動。EDKII的PcatChipsetPkg/PciHostBridgeDxe下是PC-AT結(jié)構(gòu)的PciHostBridge驅(qū)動的參考實現(xiàn),不同的PCI架構(gòu)掃描PCI總線時是不一樣的,需針對平臺具體PCI架構(gòu)進(jìn)行適當(dāng)修改。MdeModulePkg/Bus/PciBusDxe是PCIBUS驅(qū)動的實現(xiàn),通常來說該驅(qū)動程序所做的工作與平臺無關(guān),不需要修改,除非是要對設(shè)備的配置空間做一些修正。USB驅(qū)動包括控制器和USBBUS,IDE驅(qū)動包括IDE控制器和IDEBUS驅(qū)動,控制器與硬件相關(guān),USB控制器需針對平臺細(xì)節(jié)編寫,PcAtChipsetPkg/Bus/Pci/IdeControllerDxe是IDE控制器的驅(qū)動實現(xiàn),MdeModulePkg/Bus/Usb是關(guān)于USBBUS的驅(qū)動實現(xiàn),IntelFramework/Bus/Pci/IdeBusDxe是IDEBUS的驅(qū)動實現(xiàn)。該硬件平臺板級設(shè)備包括龍芯CPU、芯片組、計時器、定時器、Flash等,固件內(nèi)部支持PCD機制、容錯寫機制、HII(HumanInterfaceInfrastructure)以及GPT分區(qū)格式,DXE驅(qū)動包含對以上內(nèi)容支持以及產(chǎn)生架構(gòu)協(xié)議的驅(qū)動。EDKII/MdeModulePkg/Universal包含一組平臺通用的驅(qū)動,包括WatchdogTimerDxe、Metronome、Variable等,同時EmbeddedPkg中包含對RealTimeClock和Reset驅(qū)動的實現(xiàn),它們與硬件關(guān)系密切,針對平臺硬件進(jìn)行修改后即可加入該固件中。EDKII/MdeModulePkg/Universal/Disk下的模塊提供對GPT的支持,同時參考FatBinPkg的代碼實現(xiàn)Fat文件系統(tǒng)驅(qū)動,或者實現(xiàn)其他文件系統(tǒng)驅(qū)動,如NTFS[6]等。MdeModulePkg/Universal/PCD實現(xiàn)PCD機制的功能和操作,MdeModulePkg/Universal/下HiiDatabaseDxe和SetupBrowserDxe對Hii進(jìn)行支持。除此之外,其余驅(qū)動則需要根據(jù)主板硬件編寫,如Flash、南橋等,實現(xiàn)對這些硬件操作的抽象接口即協(xié)議。外部設(shè)備驅(qū)動程序由平臺上連接的外部設(shè)備數(shù)量和種類決定??刂婆_提供給用戶基本的系統(tǒng)輸入輸出信息,MdeModulePkg/Universal/Console中包含提供控制臺服務(wù)的UEFI驅(qū)動。若目標(biāo)平臺要求支持網(wǎng)絡(luò)引導(dǎo)或者要求圖形顯示,固件還應(yīng)該分別實現(xiàn)該平臺所使用網(wǎng)卡和顯示芯片的驅(qū)動程序。如果平臺使用了PCI、USB或者其它類型的設(shè)備,并且要在BIOS環(huán)境中使用這些設(shè)備,也必須實現(xiàn)相應(yīng)的設(shè)備驅(qū)動程序。

4.2.3BDS架構(gòu)

BDS架構(gòu)協(xié)議是引導(dǎo)進(jìn)入BDS階段的標(biāo)準(zhǔn)接口,由BdsDxe驅(qū)動模塊產(chǎn)生。該階段代碼參考EDKII/IntelFrameworkModulePkg/Universal/BdsDxe實現(xiàn),它在DXE階段被發(fā)現(xiàn)并加載,DXE結(jié)束時將調(diào)用其入口函數(shù)。BDS階段可進(jìn)入圖形界面進(jìn)行系統(tǒng)管理或者配置啟動選項,用戶還可以創(chuàng)建UEFI應(yīng)用程序?qū)ο到y(tǒng)進(jìn)行安全檢測、診斷系統(tǒng)問題或者提供其他安全保障方案。

5調(diào)試及安裝運行

EDKII的MdePkg/Libarary中提供了Debug庫用于BIOS開發(fā)調(diào)試,它們可以格式化打印輸出代碼的調(diào)試信息,便于對代碼中的錯誤進(jìn)行定位和分析。通過串口輸出調(diào)試信息,還需根據(jù)平臺串口配置編寫相應(yīng)的Debug庫方法。代碼編譯得到二進(jìn)制FD文件之后,燒寫到IO地址空間0xBFC00000所對應(yīng)的Flash地址(在龍芯平臺上,系統(tǒng)上電時從該地址尋找第一條執(zhí)行指令)。系統(tǒng)上電后,BIOS引導(dǎo)至所有初始化工作完畢,可選擇直接進(jìn)入OSLoader引導(dǎo)操作系統(tǒng)或者進(jìn)入系統(tǒng)設(shè)置界面,在系統(tǒng)設(shè)置界面中,可以對系統(tǒng)進(jìn)行診斷、啟動設(shè)置、參數(shù)查看、日期設(shè)置等,或者進(jìn)入shell界面,通過shell命令查看系統(tǒng)信息、設(shè)置參數(shù)、從指定路徑手動安裝新的設(shè)備驅(qū)動、應(yīng)用程序或者從選擇的啟動設(shè)備引導(dǎo)操作系統(tǒng)。

6結(jié)束語

本文分析對比了PMON與UEFIBIOS,簡單介紹UEFIBIOS的引導(dǎo)過程,以開源框架EDKII為基礎(chǔ),描述了龍芯國產(chǎn)計算平臺的UEFIBIOS實現(xiàn)內(nèi)容和方法。隨著國產(chǎn)處理器技術(shù)和基于國產(chǎn)處理器的計算機研究及應(yīng)用的發(fā)展,UEFI的開放性、可擴展性、可移植性、標(biāo)準(zhǔn)接口編程以及快速開機等優(yōu)點使其在國產(chǎn)計算機平臺上具有廣闊的應(yīng)用前景。固件技術(shù)的發(fā)展將提高和促進(jìn)計算機技術(shù)水平及其安全性,UEFIBIOS在國產(chǎn)計算平臺上的應(yīng)用有著重大的意義。該BIOS實現(xiàn)了UEFI固件的基本功能和操作,運行良好,在之后的研究中其功能還有待進(jìn)一步的完善。同時,UEFI的特點也給BIOS帶來了新的安全問題,這些工作將在今后的工作中得到改進(jìn),比如在其中加入可信支持[7]等。