高云嶺 莊克良 丁守芳
摘 要:EDKII是目前最流行的一個(gè)高度分層和抽象化UEFI BIOS的開發(fā)架構(gòu),它針對(duì)不同平臺(tái)硬件參數(shù)設(shè)置引入了新的設(shè)計(jì)概念PCD。PCD就是在計(jì)算機(jī)系統(tǒng)初始化過(guò)程中建立起來(lái)的一個(gè)全局平臺(tái)配置數(shù)據(jù)庫(kù),它為整個(gè)平臺(tái)的驅(qū)動(dòng),函數(shù)庫(kù)和模塊組提供了有效的信息共享和設(shè)置機(jī)制。研究了數(shù)據(jù)庫(kù)建立和使用的流程和方法,同時(shí)指出該數(shù)據(jù)庫(kù)平臺(tái)在非源代碼發(fā)布中的一些設(shè)計(jì)弊端。
關(guān)鍵詞:EDKII;UEFI;BIOS;PCD
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):2095-1302(2014)10-00-03
0 引 言
BIOS是一組固化到計(jì)算機(jī)主板上一個(gè)ROM芯片中的程序,它保存著計(jì)算機(jī)最重要的基本輸入輸出的程序、系統(tǒng)設(shè)計(jì)信息、開機(jī)后自檢程序和系統(tǒng)自啟動(dòng)程序。人們經(jīng)常需要重新對(duì)FLASH芯片進(jìn)行編程以便升級(jí)BIOS,以便獲得新的功能。
UEFI BIOS是目前最主流的一個(gè)BIOS架構(gòu),約占超過(guò)70%的計(jì)算機(jī),服務(wù)器和嵌入式市場(chǎng)。它是對(duì)老的BIOS開發(fā)模式的一種徹底的革新,打破了BIOS只能用匯編語(yǔ)言開發(fā)和只能應(yīng)用在計(jì)算機(jī)和服務(wù)器市場(chǎng)的局限性,當(dāng)前越來(lái)越多的嵌入式設(shè)備、平板、手持設(shè)備、工控設(shè)備、通信設(shè)備等都在它的應(yīng)用行列。
采用UEFI BIOS開發(fā)架構(gòu)EDKII的架構(gòu),可保證同一份核心代碼運(yùn)行在不同的硬件平臺(tái)之上,僅僅需要針對(duì)平臺(tái)的特定性來(lái)設(shè)置一些特定的參數(shù),這是EDKII架構(gòu)中最難也是最核心的一個(gè)設(shè)計(jì)部分,也就是要研究全局配置數(shù)據(jù)庫(kù)PCD。
1 UEFI和EDKII簡(jiǎn)介
2000年,Intel向業(yè)界展示了BIOS的新一代接口程序EFI (Extensible Firmware Interface),并將此技術(shù)應(yīng)用于其安騰服務(wù)器平臺(tái)上。EFI是由Intel推出的一種在未來(lái)的電腦系統(tǒng)中用來(lái)替代BIOS的升級(jí)方案。2005年,在工業(yè)界達(dá)成共識(shí)的基礎(chǔ)上,Intel將EFI規(guī)范交給了一個(gè)由微軟、AMD、惠普等公司共同參與的工業(yè)聯(lián)盟進(jìn)行管理,并將實(shí)現(xiàn)該規(guī)范的核心代碼開源于網(wǎng)站上。與此同時(shí),EFI也正式更名為UEFI(Unified Extensible Firmware Interface)。UEFI聯(lián)盟將負(fù)責(zé)開發(fā)、管理和推廣UEFI規(guī)范。
UEFI定義了操作系統(tǒng)與系統(tǒng)硬件平臺(tái)固件之間的開放接口。該規(guī)范定義的接口包括平臺(tái)相關(guān)信息、啟動(dòng)服務(wù)例程以及操作系統(tǒng)運(yùn)行時(shí)服務(wù)例程。操作系統(tǒng)裝載器與操作系統(tǒng)可通過(guò)接口調(diào)用這些服務(wù)例程。UEFI規(guī)范是一個(gè)公開的純接口定義,它不依賴于某個(gè)特定的BIOS制造商或某個(gè)特定的BIOS的實(shí)現(xiàn),它僅僅定義了平臺(tái)固件必須實(shí)現(xiàn)的接口,以及操作系統(tǒng)可能使用的一系列接口與數(shù)據(jù)結(jié)構(gòu),其實(shí)現(xiàn)的方式與細(xì)節(jié)均取決于該規(guī)范的實(shí)現(xiàn)者。UEFI規(guī)范還定義了固件驅(qū)動(dòng)程序模型,使得所有遵循此模型開發(fā)的固件驅(qū)動(dòng)程序能夠互相協(xié)作。
不同于傳統(tǒng)的BIOS實(shí)現(xiàn),EDKII基于現(xiàn)代軟件體系設(shè)計(jì)的思想,對(duì)UEFI Framework采用模塊化設(shè)計(jì),并根據(jù)其執(zhí)行流程主要?jiǎng)澐譃椋篠EC、PEI、DXE、BDS、TSL、RT和AL等7個(gè)階段,其運(yùn)行機(jī)理如圖1所示。
SEC(Security)是平臺(tái)上電后最先執(zhí)行的步驟。這個(gè)階段的主要目的是對(duì)平臺(tái)固件進(jìn)行驗(yàn)證,確保選擇的平臺(tái)固件映像沒(méi)有被破壞。主要工作是初始化臨時(shí)內(nèi)存區(qū)并對(duì)平臺(tái)早期初始化代碼進(jìn)行驗(yàn)證。
PEI(Pre-EFI Initialization)階段有兩個(gè)主要任務(wù):確定重新啟動(dòng)的來(lái)源和做盡可能少的工作以便尋找和初始化內(nèi)存,為DXE階段提供少量的固定內(nèi)存。
DXE(Driver Execution Environment)被設(shè)計(jì)來(lái)處理與外圍設(shè)備的通信,它通過(guò)加載驅(qū)動(dòng)的方式(輪詢檢測(cè))來(lái)為操作系統(tǒng)的啟動(dòng)管理構(gòu)建環(huán)境。
BDS(Boot Device Selection)是UEFI擁有平臺(tái)控制權(quán)的最后一個(gè)階段。BDS與DXE階段一起工作,為啟動(dòng)操作系統(tǒng)建立控制臺(tái)。
TSL(Transient System Load)即操作系統(tǒng)啟動(dòng)管理器嘗試引導(dǎo)操作系統(tǒng)的階段。
RT(Run Time)是操作系統(tǒng)啟動(dòng)運(yùn)行后,UEFI提供的一組運(yùn)行時(shí)服務(wù)。
AL(After Life)階段,即最后一個(gè)階段,其提供一種機(jī)制來(lái)保證用戶在有意或者無(wú)意的情況下終止操作系統(tǒng)后,讓UEFI重新獲得系統(tǒng)控制權(quán)。
2 全局配置數(shù)據(jù)庫(kù)PCD的設(shè)計(jì)實(shí)現(xiàn)
EDKII中PCD根據(jù)其作用的時(shí)間,分兩大類,一類是在編譯過(guò)程中起作用,這類PCD等同于C語(yǔ)言中的全局靜態(tài)變量,包含F(xiàn)eatureFlag PCD, FixedAtBuild PCD以及PatchableInModule PCD三種。這類PCD跟全局配置數(shù)據(jù)庫(kù)沒(méi)有關(guān)系,所以本文不做過(guò)多介紹。另一類是平臺(tái)初始化過(guò)程中起作用,包括DynamicDefault PCD, DynamicHII PCD, 和DynamicVpd PC三種應(yīng)用在源代碼組件發(fā)布的PCD,以及與之對(duì)應(yīng)的DynamicExDefault PCD, DynamicExHII PCD 和DynamicExVpd PCD——專門應(yīng)用在編譯好的二進(jìn)制組件發(fā)布中的三種PCD。
2.1 PCD的分類和區(qū)別
從大面上,全局配置數(shù)據(jù)庫(kù)中存放的PCD被分為兩個(gè)大類Dynamic和DynamicEx,每個(gè)大類又各分三個(gè)小類Default PCD, HII PCD和VPD PCD。
Dynamic和DynamicEx的作用局域完全一樣,唯一的區(qū)別就是源代碼級(jí)別的發(fā)布還是編譯好的代碼發(fā)布。如果上層開發(fā)者給二級(jí)開發(fā)者提供的是所有驅(qū)動(dòng)的源代碼,那么二級(jí)開發(fā)者可以直接修改源代碼來(lái)改變某個(gè)參數(shù)的值,此時(shí)只要把該配置參數(shù)設(shè)置為Dynamic形式的即可滿足要求。否則,必須用DynamicEx的。DynamicEx的PCD在保護(hù)上層開發(fā)者的版權(quán)和代碼發(fā)布權(quán)限提供了更多層次的選擇空間。
Default PCD:在初始化過(guò)程中,可以被PEI,DXE和RT階段的幾乎所有驅(qū)動(dòng)所使用,一般是前面的驅(qū)動(dòng)修改,后面的驅(qū)動(dòng)讀取。這是不同的驅(qū)動(dòng),不同的階段之間有效信息交互和傳遞的一種方法。該P(yáng)CD的作用空間是一次加電過(guò)程,所修改的數(shù)值在系統(tǒng)斷電后會(huì)自動(dòng)回復(fù)到默認(rèn)初始狀態(tài)。
HII PCD:作用空間和Default PCD一樣,主要的區(qū)別是HII的PCD可以把修改的數(shù)值直接保存到BIOS NOR Flash芯片的NVRAM區(qū)域。這樣一旦修改,再計(jì)算機(jī)下次啟動(dòng)的時(shí)候,訪問(wèn)的就是上次修改的新數(shù)值。
VPD PCD:作用空間和上面兩種相同,主要區(qū)別是VPD PCD是只讀的不能修改,但是它也有自己的優(yōu)勢(shì)。因?yàn)閂PD PCD是的初始值是保存在BIOS固件的一段二進(jìn)制數(shù)據(jù)空間上的所以在固件編譯完成后,可以在不依賴編譯器重新編譯情況下,對(duì)該P(yáng)CD的數(shù)值進(jìn)行直接的重復(fù)設(shè)置。
2.2 設(shè)計(jì)原理分析
在EDKII源代碼編譯中,編譯工具集的AutoGen會(huì)遍歷整個(gè)平臺(tái)所有驅(qū)動(dòng)和頂層結(jié)構(gòu)文件生成AutoGen.h和AutoGen.c兩個(gè)關(guān)鍵文件。這兩個(gè)文件將作為后面C編譯器的自動(dòng)包換的頭文件輸入,參與C語(yǔ)言的系統(tǒng)級(jí)編譯過(guò)程,最終生成這個(gè)平臺(tái)的全局配置數(shù)據(jù)庫(kù)。
下面通過(guò)一個(gè)NT32模擬平臺(tái)中的例子來(lái)進(jìn)行過(guò)程說(shuō)明。
首先在NT32的頂層平臺(tái)文件DEC, DSC和INF文件中依次做如下聲明。
MdeModulePkg.dec
[PcdsFixedAtBuild, PcdsDynamic, PcdsDynamicEx]
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|0x0|UINT32|0x30000001
Nt32Pkg.dsc
[PcdsDynamicExDefault.common.DEFAULT]
gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|0xf000
WinNtFlashMapPei.inf
[Pcd]
gEfiNt32PkgTokenSpaceGuid.PcdWinNtFlashNvStorageVariableBase
通過(guò)該聲明,定義了一個(gè)DynamicExDefault類型的PCD,其類型為UINT32,初始默認(rèn)數(shù)值為0xf000,并且驅(qū)動(dòng)模塊WinNtFlashMapPei要使用該配置數(shù)據(jù)。
接著用EDKII的BaseTools對(duì)該源代碼架構(gòu)進(jìn)行編譯,AutoGen工具會(huì)在遍歷完整個(gè)代碼之后,在相應(yīng)的PCD驅(qū)動(dòng)編譯目錄下面自動(dòng)生成AutoGen.h和AutoGen.c兩個(gè)文件,如下所示:
AutoGen.h (Build\NT32\DEBUG_MYTOOLS\IA32\MdeModulePkg\Universal\PCD\Pei\Pcd\DEBUG)
#define PEI_LOCAL_TOKEN_NUMBER_TABLE_SIZE 3
#define PEI_LOCAL_TOKEN_NUMBER 3
#define PEI_EXMAPPING_TABLE_SIZE 1U
#define PEI_EX_TOKEN_NUMBER 1U
#define PEI_SIZE_TABLE_SIZE 2U
typedef struct {
UINT32 PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc[1];
DYNAMICEX_MAPPING ExMapTable[PEI_EXMAPPING_TABLE_SIZE];
UINT32 LocalTokenNumberTable[PEI_LOCAL_TOKEN_NUMBER_TABLE_SIZE];
GUID GuidTable[PEI_GUID_TABLE_SIZE];
UINT8 StringTable[1]; /* _ */
SIZE_INFO SizeTable[PEI_SIZE_TABLE_SIZE];
UINT8 SkuIdTable[PEI_SKUID_TABLE_SIZE];
SKU_ID SystemSkuId;
} PEI_PCD_DATABASE_INIT;
AutoGen.c (Build\NT32\DEBUG_MYTOOLS\IA32\MdeModulePkg\Universal\PCD\Pei\Pcd\DEBUG)
PEI_PCD_DATABASE_INIT gPEIPcdDbInit = {
{ 0xf000U }, /* PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc[1] */
/* ExMapTable */ {{ 0x30000001U, 2U, 0U },},
/* LocalTokenNumberTable */
{
offsetof(PEI_PCD_DATABASE, Uninit.PcdFlashNvStorageFtwSpareBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_TYPE_UINT32,
offsetof(PEI_PCD_DATABASE, Init.PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_TYPE_UINT32,
},
/* GuidTable */
{{ 0xA1AFF049, 0xFDEB, 0x442a, { 0xB3, 0x20, 0x13, 0xAB, 0x4C, 0xB7, 0x2B, 0xBC }},},
//gEfiMdeModulePkgTokenSpaceGuid
/* StringTable */ /* SizeTable *//* SkuIdTable */
};
AutoGen.h自動(dòng)生成的是該數(shù)據(jù)庫(kù)的結(jié)構(gòu)定義文件,它定義了各個(gè)PCD在該數(shù)據(jù)庫(kù)中存放的數(shù)據(jù)位置、類型、偏移量等信息。AutoGen.c則配合AutoGen.h詳細(xì)列出了各個(gè)比特位置存放的具體數(shù)值。
當(dāng)WinNtFlashMapPei驅(qū)動(dòng)模塊中想要訪問(wèn)該P(yáng)CD數(shù)值的時(shí)候,只需要在C語(yǔ)言中引用PcdGet32Ex(gEfiMdeModulePkgTokenSpaceGuid, 0x30000001)。這時(shí)就會(huì)自動(dòng)掃描Init.ExMapTable 和Init.GuidTable兩張數(shù)據(jù)庫(kù)表取得該P(yáng)CD對(duì)應(yīng)的LocalTokenNumber數(shù)值 “2U”。
而后根據(jù)映射LocalTokenNumber的數(shù)值找到“offsetof(PEI_PCD_DATABASE, Init.PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_TYPE_UINT32”。
通過(guò)在C語(yǔ)言中解析“offsetof(PEI_PCD_DATABASE, Init.PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_TYPE_UINT32”的定義,就可以得到該P(yáng)CD在數(shù)據(jù)庫(kù)中的偏移量、PCD類型和數(shù)據(jù)類型信息。
其過(guò)程如圖2所示:
圖2 PCD訪問(wèn)過(guò)程
3 設(shè)計(jì)局限性和改進(jìn)方法
在該數(shù)據(jù)庫(kù)生成過(guò)程中,離不開對(duì)MS, ICC或者GCC編譯器的支持,這樣DynamicEx所宣稱的二進(jìn)制固件發(fā)布模式受到約束。換言之,想要完全的二進(jìn)制驅(qū)動(dòng)組件的發(fā)布,必須讓EDKII整個(gè)平臺(tái)PCD的生成過(guò)程脫離對(duì)任何編譯器的依賴性。
針對(duì)這個(gè)設(shè)計(jì)要求,提出了新的設(shè)計(jì)架構(gòu),其流程圖如圖3所示:
圖3 PCD數(shù)據(jù)庫(kù)生成流程改進(jìn)
在新的架構(gòu)中,主要改變的是AutoGen的組件,EDKII的編譯工具集依然會(huì)遍歷整個(gè)架構(gòu)的所有驅(qū)動(dòng)和上層配置文件,但它會(huì)直接生成PCD數(shù)據(jù)庫(kù),同時(shí)生成一份包含改數(shù)據(jù)庫(kù)結(jié)構(gòu)的AutoGen.h文件和一份空的只包含注釋信息AutoGen.c文件。AutoGen.h和AutoGen.c依然采用PEI/DXE驅(qū)動(dòng)的源代碼編譯,只不過(guò)PCD數(shù)據(jù)庫(kù)不在依賴該過(guò)程產(chǎn)生,因此稍加改動(dòng),就可使DynamicEx真正發(fā)揮其所宣稱的作用。
4 結(jié) 語(yǔ)
EDKII的PCB數(shù)據(jù)庫(kù)目前在國(guó)內(nèi)沒(méi)有任何論文研究發(fā)表過(guò),本文主要針對(duì)這個(gè)空白領(lǐng)域,分析和研究了EDKII 最核心、最關(guān)鍵的全局?jǐn)?shù)據(jù)設(shè)置數(shù)據(jù)庫(kù)PCD的設(shè)計(jì)和實(shí)現(xiàn),并指出了其設(shè)計(jì)的不足。隨著UEFI BIOS的廣泛應(yīng)用,越來(lái)越多的軍用板卡、通信主板、嵌入式設(shè)備和服務(wù)器也會(huì)轉(zhuǎn)移到這個(gè)架構(gòu)上。如果用一個(gè)穩(wěn)定不變的核心代碼來(lái)支持不同的設(shè)備,必然會(huì)減少維護(hù)成本,提高開發(fā)效率,以及提高設(shè)備的質(zhì)量,這就是本文所研究的PCD技術(shù)的意義所在。
參考文獻(xiàn)
[1] UEFI Forum. UEFI Specification. Version 2.3[EB/OL]. http://www.uefi.org/specs,2010
[2] UEFI Forum. UEFI Platform Initialization Specification. Version 1.2. [EB/OL]. http://www.uefi.org/specs,2010
[3] Vincent Zimmer. Beyond BIOS[M]. Intel corporation,2006.
[4] Framework Open Source Community. Pre_EFI Initialization Core Interface [EB/OL].http://www.uefi.org/specs,2008
[5] Intel Corporation.EDK II C Coding Standard[S]. 2006
[6] 倪光南. UEFI BIOS是軟件業(yè)的藍(lán)海[EB/OL]. http://soft.chinabyte.com/90/3382590_1.shtml,2007
[7] Gaurav Banga. EFI/UEFI 將帶領(lǐng)PC產(chǎn)業(yè)進(jìn)入下一世代[EB/OL].
offsetof(PEI_PCD_DATABASE, Init.PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_TYPE_UINT32,
},
/* GuidTable */
{{ 0xA1AFF049, 0xFDEB, 0x442a, { 0xB3, 0x20, 0x13, 0xAB, 0x4C, 0xB7, 0x2B, 0xBC }},},
//gEfiMdeModulePkgTokenSpaceGuid
/* StringTable */ /* SizeTable *//* SkuIdTable */
};
AutoGen.h自動(dòng)生成的是該數(shù)據(jù)庫(kù)的結(jié)構(gòu)定義文件,它定義了各個(gè)PCD在該數(shù)據(jù)庫(kù)中存放的數(shù)據(jù)位置、類型、偏移量等信息。AutoGen.c則配合AutoGen.h詳細(xì)列出了各個(gè)比特位置存放的具體數(shù)值。
當(dāng)WinNtFlashMapPei驅(qū)動(dòng)模塊中想要訪問(wèn)該P(yáng)CD數(shù)值的時(shí)候,只需要在C語(yǔ)言中引用PcdGet32Ex(gEfiMdeModulePkgTokenSpaceGuid, 0x30000001)。這時(shí)就會(huì)自動(dòng)掃描Init.ExMapTable 和Init.GuidTable兩張數(shù)據(jù)庫(kù)表取得該P(yáng)CD對(duì)應(yīng)的LocalTokenNumber數(shù)值 “2U”。
而后根據(jù)映射LocalTokenNumber的數(shù)值找到“offsetof(PEI_PCD_DATABASE, Init.PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_TYPE_UINT32”。
通過(guò)在C語(yǔ)言中解析“offsetof(PEI_PCD_DATABASE, Init.PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_TYPE_UINT32”的定義,就可以得到該P(yáng)CD在數(shù)據(jù)庫(kù)中的偏移量、PCD類型和數(shù)據(jù)類型信息。
其過(guò)程如圖2所示:
圖2 PCD訪問(wèn)過(guò)程
3 設(shè)計(jì)局限性和改進(jìn)方法
在該數(shù)據(jù)庫(kù)生成過(guò)程中,離不開對(duì)MS, ICC或者GCC編譯器的支持,這樣DynamicEx所宣稱的二進(jìn)制固件發(fā)布模式受到約束。換言之,想要完全的二進(jìn)制驅(qū)動(dòng)組件的發(fā)布,必須讓EDKII整個(gè)平臺(tái)PCD的生成過(guò)程脫離對(duì)任何編譯器的依賴性。
針對(duì)這個(gè)設(shè)計(jì)要求,提出了新的設(shè)計(jì)架構(gòu),其流程圖如圖3所示:
圖3 PCD數(shù)據(jù)庫(kù)生成流程改進(jìn)
在新的架構(gòu)中,主要改變的是AutoGen的組件,EDKII的編譯工具集依然會(huì)遍歷整個(gè)架構(gòu)的所有驅(qū)動(dòng)和上層配置文件,但它會(huì)直接生成PCD數(shù)據(jù)庫(kù),同時(shí)生成一份包含改數(shù)據(jù)庫(kù)結(jié)構(gòu)的AutoGen.h文件和一份空的只包含注釋信息AutoGen.c文件。AutoGen.h和AutoGen.c依然采用PEI/DXE驅(qū)動(dòng)的源代碼編譯,只不過(guò)PCD數(shù)據(jù)庫(kù)不在依賴該過(guò)程產(chǎn)生,因此稍加改動(dòng),就可使DynamicEx真正發(fā)揮其所宣稱的作用。
4 結(jié) 語(yǔ)
EDKII的PCB數(shù)據(jù)庫(kù)目前在國(guó)內(nèi)沒(méi)有任何論文研究發(fā)表過(guò),本文主要針對(duì)這個(gè)空白領(lǐng)域,分析和研究了EDKII 最核心、最關(guān)鍵的全局?jǐn)?shù)據(jù)設(shè)置數(shù)據(jù)庫(kù)PCD的設(shè)計(jì)和實(shí)現(xiàn),并指出了其設(shè)計(jì)的不足。隨著UEFI BIOS的廣泛應(yīng)用,越來(lái)越多的軍用板卡、通信主板、嵌入式設(shè)備和服務(wù)器也會(huì)轉(zhuǎn)移到這個(gè)架構(gòu)上。如果用一個(gè)穩(wěn)定不變的核心代碼來(lái)支持不同的設(shè)備,必然會(huì)減少維護(hù)成本,提高開發(fā)效率,以及提高設(shè)備的質(zhì)量,這就是本文所研究的PCD技術(shù)的意義所在。
參考文獻(xiàn)
[1] UEFI Forum. UEFI Specification. Version 2.3[EB/OL]. http://www.uefi.org/specs,2010
[2] UEFI Forum. UEFI Platform Initialization Specification. Version 1.2. [EB/OL]. http://www.uefi.org/specs,2010
[3] Vincent Zimmer. Beyond BIOS[M]. Intel corporation,2006.
[4] Framework Open Source Community. Pre_EFI Initialization Core Interface [EB/OL].http://www.uefi.org/specs,2008
[5] Intel Corporation.EDK II C Coding Standard[S]. 2006
[6] 倪光南. UEFI BIOS是軟件業(yè)的藍(lán)海[EB/OL]. http://soft.chinabyte.com/90/3382590_1.shtml,2007
[7] Gaurav Banga. EFI/UEFI 將帶領(lǐng)PC產(chǎn)業(yè)進(jìn)入下一世代[EB/OL].
offsetof(PEI_PCD_DATABASE, Init.PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_TYPE_UINT32,
},
/* GuidTable */
{{ 0xA1AFF049, 0xFDEB, 0x442a, { 0xB3, 0x20, 0x13, 0xAB, 0x4C, 0xB7, 0x2B, 0xBC }},},
//gEfiMdeModulePkgTokenSpaceGuid
/* StringTable */ /* SizeTable *//* SkuIdTable */
};
AutoGen.h自動(dòng)生成的是該數(shù)據(jù)庫(kù)的結(jié)構(gòu)定義文件,它定義了各個(gè)PCD在該數(shù)據(jù)庫(kù)中存放的數(shù)據(jù)位置、類型、偏移量等信息。AutoGen.c則配合AutoGen.h詳細(xì)列出了各個(gè)比特位置存放的具體數(shù)值。
當(dāng)WinNtFlashMapPei驅(qū)動(dòng)模塊中想要訪問(wèn)該P(yáng)CD數(shù)值的時(shí)候,只需要在C語(yǔ)言中引用PcdGet32Ex(gEfiMdeModulePkgTokenSpaceGuid, 0x30000001)。這時(shí)就會(huì)自動(dòng)掃描Init.ExMapTable 和Init.GuidTable兩張數(shù)據(jù)庫(kù)表取得該P(yáng)CD對(duì)應(yīng)的LocalTokenNumber數(shù)值 “2U”。
而后根據(jù)映射LocalTokenNumber的數(shù)值找到“offsetof(PEI_PCD_DATABASE, Init.PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_TYPE_UINT32”。
通過(guò)在C語(yǔ)言中解析“offsetof(PEI_PCD_DATABASE, Init.PcdFlashNvStorageVariableBase_a1aff049_fdeb_442a_b320_13ab4cb72bbc) | PCD_TYPE_DATA | PCD_DATUM_TYPE_UINT32”的定義,就可以得到該P(yáng)CD在數(shù)據(jù)庫(kù)中的偏移量、PCD類型和數(shù)據(jù)類型信息。
其過(guò)程如圖2所示:
圖2 PCD訪問(wèn)過(guò)程
3 設(shè)計(jì)局限性和改進(jìn)方法
在該數(shù)據(jù)庫(kù)生成過(guò)程中,離不開對(duì)MS, ICC或者GCC編譯器的支持,這樣DynamicEx所宣稱的二進(jìn)制固件發(fā)布模式受到約束。換言之,想要完全的二進(jìn)制驅(qū)動(dòng)組件的發(fā)布,必須讓EDKII整個(gè)平臺(tái)PCD的生成過(guò)程脫離對(duì)任何編譯器的依賴性。
針對(duì)這個(gè)設(shè)計(jì)要求,提出了新的設(shè)計(jì)架構(gòu),其流程圖如圖3所示:
圖3 PCD數(shù)據(jù)庫(kù)生成流程改進(jìn)
在新的架構(gòu)中,主要改變的是AutoGen的組件,EDKII的編譯工具集依然會(huì)遍歷整個(gè)架構(gòu)的所有驅(qū)動(dòng)和上層配置文件,但它會(huì)直接生成PCD數(shù)據(jù)庫(kù),同時(shí)生成一份包含改數(shù)據(jù)庫(kù)結(jié)構(gòu)的AutoGen.h文件和一份空的只包含注釋信息AutoGen.c文件。AutoGen.h和AutoGen.c依然采用PEI/DXE驅(qū)動(dòng)的源代碼編譯,只不過(guò)PCD數(shù)據(jù)庫(kù)不在依賴該過(guò)程產(chǎn)生,因此稍加改動(dòng),就可使DynamicEx真正發(fā)揮其所宣稱的作用。
4 結(jié) 語(yǔ)
EDKII的PCB數(shù)據(jù)庫(kù)目前在國(guó)內(nèi)沒(méi)有任何論文研究發(fā)表過(guò),本文主要針對(duì)這個(gè)空白領(lǐng)域,分析和研究了EDKII 最核心、最關(guān)鍵的全局?jǐn)?shù)據(jù)設(shè)置數(shù)據(jù)庫(kù)PCD的設(shè)計(jì)和實(shí)現(xiàn),并指出了其設(shè)計(jì)的不足。隨著UEFI BIOS的廣泛應(yīng)用,越來(lái)越多的軍用板卡、通信主板、嵌入式設(shè)備和服務(wù)器也會(huì)轉(zhuǎn)移到這個(gè)架構(gòu)上。如果用一個(gè)穩(wěn)定不變的核心代碼來(lái)支持不同的設(shè)備,必然會(huì)減少維護(hù)成本,提高開發(fā)效率,以及提高設(shè)備的質(zhì)量,這就是本文所研究的PCD技術(shù)的意義所在。
參考文獻(xiàn)
[1] UEFI Forum. UEFI Specification. Version 2.3[EB/OL]. http://www.uefi.org/specs,2010
[2] UEFI Forum. UEFI Platform Initialization Specification. Version 1.2. [EB/OL]. http://www.uefi.org/specs,2010
[3] Vincent Zimmer. Beyond BIOS[M]. Intel corporation,2006.
[4] Framework Open Source Community. Pre_EFI Initialization Core Interface [EB/OL].http://www.uefi.org/specs,2008
[5] Intel Corporation.EDK II C Coding Standard[S]. 2006
[6] 倪光南. UEFI BIOS是軟件業(yè)的藍(lán)海[EB/OL]. http://soft.chinabyte.com/90/3382590_1.shtml,2007
[7] Gaurav Banga. EFI/UEFI 將帶領(lǐng)PC產(chǎn)業(yè)進(jìn)入下一世代[EB/OL].