UEFI國產計算機平臺BIOS研討

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

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

UEFI國產計算機平臺BIOS研討

1概述

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

2龍芯國產計算機平臺簡介

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

3UEFIBIOS的優勢

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

UEFI具有模塊化結構、C語言風格、EFI驅動模型硬件操作方式等優點。下面分別從可移植性、開機速度、可擴展性、操作界面4個方面對PMON和龍芯國產計算機平臺的UEFI固件兩者進行比較:

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

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

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

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

4固件設計與實現

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

4.1EDKII簡介

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

4.2固件實現

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

4.2.1SEC和PEI

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

4.2.2DXE

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

4.2.3BDS架構

BDS架構協議是引導進入BDS階段的標準接口,由BdsDxe驅動模塊產生。該階段代碼參考EDKII/IntelFrameworkModulePkg/Universal/BdsDxe實現,它在DXE階段被發現并加載,DXE結束時將調用其入口函數。BDS階段可進入圖形界面進行系統管理或者配置啟動選項,用戶還可以創建UEFI應用程序對系統進行安全檢測、診斷系統問題或者提供其他安全保障方案。

5調試及安裝運行

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

6結束語

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