專利名稱:利用渴望壓縮、故障保險提取和重新啟動時壓縮掃描來存儲固件變量的方法
技術(shù)領(lǐng)域:
本發(fā)明總體上涉及計算機(jī)系統(tǒng),并且更特別地而并非僅僅涉及以壓縮形式在固件中存儲變量數(shù)據(jù)的方案。
背景技術(shù):
在初始化計算機(jī)系統(tǒng)期間使用計算機(jī)平臺固件來檢驗系統(tǒng)的完整性和配置。通常還提供那些計算機(jī)系統(tǒng)的硬件和軟件組件之間基本的低級接口,使得通過執(zhí)行計算機(jī)系統(tǒng)上運行的計算機(jī)程序中包含的較高層次的軟件指令能夠?qū)崿F(xiàn)具體的硬件功能。在許多計算機(jī)中,此固件的主要部分被稱為計算機(jī)系統(tǒng)的基本輸入/輸出系統(tǒng)(BIOS)代碼。BIOS代碼包括一組持久記錄的(或者在使用閃速BIOS的系統(tǒng)的情況下半持久記錄的)向系統(tǒng)提供其基本操作特性的軟件例程,所述軟件例程包括告訴計算機(jī)當(dāng)開啟時怎樣測試自身的指令,以及怎樣確定各個內(nèi)置組件和附加外圍設(shè)備的配置的指令。
在典型的PC體系結(jié)構(gòu)中,BIOS通常被定義為在處理器重置和操作系統(tǒng)(OS)加載器的第一條指令之間運行的固件。這對應(yīng)于在冷啟動期間或響應(yīng)于系統(tǒng)重置期間所執(zhí)行的啟動操作。在冷啟動初始時刻,除處理器和固件之外實際上只初始化了很少的系統(tǒng)。固件中的代碼把系統(tǒng)初始化到這樣的程度,即是可以接管諸如硬盤之類的介質(zhì)所卸載的操作系統(tǒng)。
典型情況下,以包括單個代碼集的“單片”形式存儲固件代碼,所述代碼集由平臺制造商或BIOS廠商(諸如Phoenix或AMI)提供。單個代碼集的各個部分被用來初始化不同的系統(tǒng)組件,而其它部分用于運行期(即,引導(dǎo)后)操作。在其它情況中,可以使用一個或多個“選件ROM”來擴(kuò)展單片BIOS,所述“選件ROM”包含在一個或多個外圍裝置卡(也叫做“內(nèi)插”卡)上。例如,SCSI裝置驅(qū)動卡和視頻卡常常包括選件ROM,所述選件ROM包含對應(yīng)于由這些卡所提供的服務(wù)的BIOS代碼。典型情況下,依照預(yù)定義模式在已經(jīng)加載了單片BIOS中的固件之后或在加載單片BIOS期間,加載選件ROM中的固件。
今天的固件體系結(jié)構(gòu)包括用于擴(kuò)展除由存儲在平臺BIOS裝置(例如,閃速存儲器)中的BIOS代碼提供的BIOS功能之外的BIOS功能的設(shè)備。更特別地是,可擴(kuò)展固件接口(EFI)(在http//developer.intel.com/technology/efi可以找到其規(guī)范和例子)是用于描述在平臺固件和壓縮-包裝操作系統(tǒng)或其它定制應(yīng)用環(huán)境之間的抽象編程接口的公共工業(yè)規(guī)范。EFI框架包括用于擴(kuò)展除由存儲在平臺BIOS裝置(例如,閃速存儲器)中的BIOS代碼所提供之外的BIOS功能的設(shè)備。EFI使固件模塊和驅(qū)動器形式的固件能夠從各種不同的資源中加載,包括主要和次要閃速裝置、選件ROM、各種持久性存儲裝置(例如,硬盤、CD ROM等),甚至經(jīng)由計算機(jī)網(wǎng)絡(luò)。
EF I的特征之一是,EFI提供了用于存儲平臺固件中的持久值的抽象,稱為“變量”。變量被定義為由識別信息加上屬性(密鑰)和任意數(shù)據(jù)(值)所組成的密鑰/值對。變量意在被用為存儲在平臺中所實現(xiàn)的EFI環(huán)境和EFI OS加載器及其它在EFI環(huán)境中運行的應(yīng)用之間所傳送的數(shù)據(jù)的手段。盡管變量存儲的實現(xiàn)方式在EFI規(guī)范中沒有定義,然而在大多數(shù)情況下變量必須是持久性的。這意味著平臺上的EF I實施方式必需設(shè)置變量的存儲方式,使得為了存儲而傳送進(jìn)來的變量被保留且至少直到它們被明確地刪除或重寫,在此期間變量可以用于每次系統(tǒng)啟動。在某些平臺上此類非易失性存儲器裝置可能很有限,在不能使用其它用于傳遞信息的裝置的情況下通常要求節(jié)約地使用變量。
參考下列詳細(xì)說明結(jié)合附圖,本發(fā)明的上述方面和許多附帶的優(yōu)點將變得更容易理解,其中除非另作說明遍及各個附圖,相同的附圖標(biāo)記指的是相同的部件圖1是舉例說明依照可擴(kuò)展固件接口(EFI)架構(gòu)所執(zhí)行的各個執(zhí)行階段的示意圖;圖2是舉例說明由本發(fā)明的實施例在固件變量訪問期間所使用的EFI系統(tǒng)表的各個組件的框圖;
圖3a是依照本發(fā)明的一個實施例舉例說明在系統(tǒng)初始化期間為加載固件變量所執(zhí)行的邏輯和操作的流程圖;圖3b是依照本發(fā)明的一個實施例舉例說明在固件變量讀取過程期間所執(zhí)行的邏輯和操作的流程圖;圖4是依照本發(fā)明的一個實施例舉例說明用于支持壓縮/解壓縮操作的固件組件的配置的示意圖;圖5是依照本發(fā)明一個實施例舉例說明在固件變量寫入過程期間所執(zhí)行的邏輯和操作的流程圖,其中在所述固件變量寫入過程下利用渴望壓縮(eager compression)存儲變量;圖6是依照本發(fā)明一個實施例舉例說明在固件變量合并過程期間所執(zhí)行的邏輯和操作的流程圖;圖7是依照本發(fā)明一個實施例舉例說明在重新啟動變量壓縮掃描過程期間所執(zhí)行的邏輯和操作的流程圖;圖8是依照本發(fā)明的一個實施例舉例說明用于支持加密/解密操作的固件組件的配置的示意圖;圖9a是依照本發(fā)明的一個實施例舉例說明在固件變量讀取操作期間所執(zhí)行的邏輯和操作的流程圖,在所述固件變量讀取操作中可以獲取加密和未加密的變量;圖9b是依照本發(fā)明的一個實施例與圖9a類似的流程圖,其中還添加了壓縮/解壓縮操作以便能夠獲取加密/未加密和壓縮/未壓縮的變量;圖10a是依照本發(fā)明一個實施例舉例說明在固件變量寫入過程期間所執(zhí)行的邏輯和操作的流程圖,在所述固件變量寫入過程內(nèi)使用渴望的加密來存儲變量;圖10b是依照本發(fā)明一個實施例舉例說明在固件變量寫入過程期間所執(zhí)行的邏輯和操作的流程圖,在所述固件變量寫入過程內(nèi)使用渴望的加密和渴望的壓縮的組合來存儲變量;圖11是舉例說明可以用于實現(xiàn)這里所公開的本發(fā)明實施例的示例性計算機(jī)系統(tǒng)的示意圖。
具體實施例方式
這里描述了對應(yīng)于利用壓縮和故障保險提取來存儲固件變量的模式的方法、固件和計算機(jī)系統(tǒng)的實施例。在下面描述中,闡明了許多具體細(xì)節(jié)以便提供對本發(fā)明更徹底的了解。然而,相關(guān)領(lǐng)域的技術(shù)人員將認(rèn)識到可以在沒有一個或多個具體細(xì)節(jié)的情況下或用其它方法、組件、材料等實施本發(fā)明。在其它實例中,沒有詳細(xì)示出或描述眾所周知的結(jié)構(gòu)、材料或操作以免模糊本發(fā)明的特征。
遍及整個說明書,對“一個實施例”或“一實施例”的引用意味著聯(lián)合實施例描述的特定特征、結(jié)構(gòu)或特性包含在本發(fā)明的至少一個實施例中。因此,在整個說明書中不同位置出現(xiàn)的短語“在一個實施例中”或“在一實施例中”不必都參照相同的實施例。此外,可以在一個或多個實施例中以任何適當(dāng)?shù)姆绞浇M合特定的特征、結(jié)構(gòu)或特性。
依照本發(fā)明一方面,公開了一種架構(gòu)所述架構(gòu)提供了能夠壓縮并且故障保險提取固件變量的機(jī)制。本發(fā)明的實施例提供了一種手段,借此如果壓縮器丟失,那么依照可以無縫降級(即,故障保險)的方式,經(jīng)由解壓縮/壓縮虛擬化平臺的閃速存儲。
依照一個實施例,該架構(gòu)是經(jīng)由EFI所提供的設(shè)備來實現(xiàn)的。圖1示出了一個事件順序/結(jié)構(gòu)圖,用于舉例說明由EFI兼容架構(gòu)下的平臺響應(yīng)于冷啟動(例如,電源關(guān)/開重置)所執(zhí)行的操作。所述過程邏輯上被分成幾個階段,包括預(yù)EFI初始化環(huán)境(PEI)階段、驅(qū)動器執(zhí)行環(huán)境(DXE)階段、引導(dǎo)裝置選擇(BDS)階段、瞬時系統(tǒng)加載(TSL)階段和操作系統(tǒng)運行期(RT)階段。所述階段彼此依賴以便向OS和平臺提供適當(dāng)?shù)倪\行期環(huán)境。
PEI階段向處理器(CPU)、芯片組和母板提供了用于加載并調(diào)用具體初始配置例程的標(biāo)準(zhǔn)化方法。PEI階段負(fù)責(zé)足夠地初始化系統(tǒng)以便為下面階段提供穩(wěn)定的基礎(chǔ)。在PEI階段期間執(zhí)行平臺核心組件的初始化,所述平臺核心組件包括CPU、芯片組和主板(即,母板)。此階段還被稱為“早期初始化”階段。在此階段期間所執(zhí)行的典型操作包括POST(加電自檢)操作,以及發(fā)現(xiàn)平臺資源。特別地是,PEI階段發(fā)現(xiàn)存儲器并且準(zhǔn)備被切換到DXE階段的資源映射。在PEI階段結(jié)束時的系統(tǒng)狀態(tài)經(jīng)由一列位置無關(guān)的數(shù)據(jù)結(jié)構(gòu)(稱作切換塊(Hand Off Block HOB))被傳送到DXE階段。
DXE階段是執(zhí)行大部分系統(tǒng)初始化的階段。由包括DXE核心100、DXE調(diào)度器102和一組DXE驅(qū)動器104的幾個組件來使DXE階段便于進(jìn)行。DXE核心100生成一組引導(dǎo)服務(wù)106、運行期服務(wù)108和DXE服務(wù)110。DXE調(diào)度器102負(fù)責(zé)發(fā)現(xiàn)并以正確的次序執(zhí)行DXE驅(qū)動器104。DXE驅(qū)動器104負(fù)責(zé)初始化處理器、芯片組和平臺組件,以及向控制臺和引導(dǎo)裝置提供軟件抽象。這些組件一起運行以便初始化平臺并且提供引導(dǎo)操作系統(tǒng)所需的服務(wù)。DXE和引導(dǎo)設(shè)備選擇階段一起運行以便建立控制臺并且試圖引導(dǎo)操作系統(tǒng)。當(dāng)操作系統(tǒng)成功開始其引導(dǎo)過程時(即,BDS階段開始),終止DXE階段。只允許運行期服務(wù)和所選擇的由DXE核心提供的DXE服務(wù)以及所選擇的由運行期DXE驅(qū)動器提供的服務(wù)持續(xù)到OS運行期環(huán)境。DXE的結(jié)果是完全成形的EFI接口的表示。
DXE核心被設(shè)計成完全可移植的,而沒有CPU、芯片組或平臺相關(guān)性。這通過幾個特征的設(shè)計來實現(xiàn)。第一,DXE核心只依賴于其初始狀態(tài)的HOB列表。這意味著DXE核心不依賴于來自先前階段的任何服務(wù),所以一旦所述HOB列表被傳送到DXE核心所有先前階段可以被卸載。第二,DXE核心不包含任何硬編碼的地址。這意味著DXE核心可以被加載到物理存儲器中的任何地方,并且不管物理存儲器或固件段在處理器的物理地址空間中位于哪里,它都能夠正確工作。第三,DXE核心不包含任何具體CPU、具體芯片組或具體平臺的信息。相反,DXE核心是通過一組體系結(jié)構(gòu)協(xié)議接口從系統(tǒng)硬件中抽象出來的。這些體系結(jié)構(gòu)協(xié)議接口由DXE驅(qū)動器104生成,所述DXE驅(qū)動器104由DXE調(diào)度器102調(diào)用。
DXE核心生成EFI系統(tǒng)表200及其相關(guān)聯(lián)的引導(dǎo)服務(wù)106和運行期服務(wù)108的集合,如圖2所示。DXE核心還保持一句柄數(shù)據(jù)庫202。所述句柄數(shù)據(jù)庫包括一個或多個句柄的列表,其中句柄是一個或多個唯一協(xié)議GUID(全局唯一標(biāo)識符)的列表,所述GUID映射到各自的協(xié)議204。協(xié)議是服務(wù)集的軟件抽象。某些協(xié)議抽象I/O裝置,以及其它協(xié)議抽象通用的系統(tǒng)服務(wù)集。典型情況下,協(xié)議包含一組API和一些數(shù)據(jù)字段。每個協(xié)議由GUID命名,并且DXE核心生成允許協(xié)議在句柄數(shù)據(jù)庫注冊的服務(wù)。當(dāng)DXE調(diào)度器執(zhí)行DXE驅(qū)動器,附加協(xié)議將被添加到包括體系結(jié)構(gòu)協(xié)議的句柄數(shù)據(jù)庫,所述體系結(jié)構(gòu)協(xié)議用于根據(jù)平臺的具體情況來抽象DXE核心。
引導(dǎo)服務(wù)包括在DXE和BDS階段期間所使用的服務(wù)集。其中,這些服務(wù)包括存儲器服務(wù)、協(xié)議句柄服務(wù)和驅(qū)動器支持服務(wù)。存儲器服務(wù)提供服務(wù)以便分配和釋放存儲頁面,以及以字節(jié)界限分配和釋放存儲池。存儲器服務(wù)還提供了用于獲取在平臺中所有當(dāng)前物理存儲器使用情況的映射的服務(wù)。協(xié)議句柄服務(wù)提供了用于從句柄數(shù)據(jù)庫添加和刪除句柄的服務(wù)。還提供了根據(jù)句柄數(shù)據(jù)庫中的句柄來添加和刪除協(xié)議的服務(wù)。附加服務(wù)可用于允許任何組件查找句柄數(shù)據(jù)庫中的句柄,以及開放和關(guān)閉句柄數(shù)據(jù)庫中的協(xié)議。支持服務(wù)提供了用于把驅(qū)動器與平臺中的裝置連接和斷開的服務(wù)。BDS階段使用這些服務(wù)以便把所有驅(qū)動器連接到所有裝置,或者只把最小數(shù)目的驅(qū)動器連接到所要求的裝置以便建立控制臺并且引導(dǎo)操作系統(tǒng)(即,以便支持快速引導(dǎo)機(jī)制)。
與引導(dǎo)服務(wù)對比,運行期服務(wù)在預(yù)引導(dǎo)和OS運行期操作期間都可用。由這里所公開的實施例支持的運行期服務(wù)之一是變量服務(wù)。如下面進(jìn)一步詳述,變量服務(wù)提供了從易失和非易失性存儲器中查找、添加和刪除環(huán)境變量的服務(wù)。如這里所用,變量服務(wù)被稱為“通用的”,這是因為它獨立于任何本發(fā)明實施例為其更新固件的系統(tǒng)組件。
DXE服務(wù)表包括對應(yīng)于只在預(yù)引導(dǎo)期間可用的第一DXE服務(wù)集206A和在預(yù)引導(dǎo)和OS運行期都可用的第二DXE服務(wù)集206B的數(shù)據(jù)。只在預(yù)引導(dǎo)期間可用的服務(wù)包括全局一致性域服務(wù),其提供對平臺中的I/O資源、存儲映象的I/O資源和系統(tǒng)存儲器資源進(jìn)行管理的服務(wù)。還包括的是DXE調(diào)度器服務(wù),其提供了對被DXE調(diào)度器所調(diào)度的DXE驅(qū)動器進(jìn)行管理的服務(wù)。
由引導(dǎo)服務(wù)106、運行期服務(wù)108和DXE服務(wù)110中的每個所提供的服務(wù)經(jīng)由各自的API集112、114和116訪問。API提供了抽象接口,所述抽象接口使得隨后加載的組件能支持所選擇的、由DXE核心所提供的服務(wù)。
在初始化DXE核心100之后,控制交給DXE調(diào)度器102。DXE調(diào)度器負(fù)責(zé)加載和調(diào)用在固件卷中找到的DXE驅(qū)動器,所述固件卷對應(yīng)于在EFI架構(gòu)下從其加載固件的邏輯存儲單元。DXE調(diào)度器在由HOB列表所描述的固件卷中搜索驅(qū)動器。隨著執(zhí)行的繼續(xù),可以定位其它固件卷。當(dāng)定位它們時,調(diào)度器也搜索它們的驅(qū)動器。
存在兩個DXE驅(qū)動器子類。第一子類包括在DXE階段中很早執(zhí)行的DXE驅(qū)動器。這些DXE驅(qū)動器的執(zhí)行次序取決于先驗文件的存在和內(nèi)容以及對相關(guān)性表達(dá)的估計。這些早期DXE驅(qū)動器典型情況下會包含處理器、芯片組和平臺初始化代碼。這些早期驅(qū)動器典型情況下還會生成體系結(jié)構(gòu)協(xié)議,DXE核心需要所述體系結(jié)構(gòu)協(xié)議來生成引導(dǎo)服務(wù)和運行期服務(wù)的完整補(bǔ)充。
第二類DXE驅(qū)動器是那些符合EFI 1.10驅(qū)動器模型的驅(qū)動器。這些驅(qū)動器當(dāng)由DXE調(diào)度器執(zhí)行時,不執(zhí)行任何硬件初始化。作為替代,它們在句柄數(shù)據(jù)庫中注冊驅(qū)動器綁定協(xié)議接口。驅(qū)動器綁定協(xié)議集由BDS階段使用來把驅(qū)動器連接到建立控制臺和提供對引導(dǎo)裝置訪問所需的裝置上。符合EFI 1.10驅(qū)動器模型的DXE驅(qū)動器最終向控制臺裝置和引導(dǎo)裝置提供軟件抽象,當(dāng)它們被明確要求這樣做時。
任何DXE驅(qū)動器可能消耗引導(dǎo)服務(wù)和運行期服務(wù)以便執(zhí)行它們的功能。然而,早期DXE驅(qū)動器需要知道當(dāng)它們執(zhí)行時不是所有的這些服務(wù)都可用,這是因為可能尚未注冊所有的體系結(jié)構(gòu)協(xié)議。在執(zhí)行之前DXE驅(qū)動器必須使用相關(guān)性表達(dá)以便保證它們所要求的服務(wù)和協(xié)議接口是可用的。
對于符合EFI 1.10驅(qū)動器模型的DXE驅(qū)動器不必考慮這種可能性。這些驅(qū)動器在執(zhí)行時簡單地在句柄數(shù)據(jù)庫中注冊驅(qū)動器綁定協(xié)議。此操作可以在不使用任何體系結(jié)構(gòu)協(xié)議的情況下執(zhí)行。結(jié)合注冊驅(qū)動器綁定協(xié)議,DXE驅(qū)動器可以通過使用InstallConfigurationTable函數(shù)來“發(fā)布(publish)”API。這個發(fā)布的驅(qū)動器由API 118來描述。在EFI下,發(fā)布API使得該API可由其它固件組件訪問。API向裝置、總線或服務(wù)提供接口,在它們各自的生存期DXE驅(qū)動器與它們對應(yīng)。
BDS體系結(jié)構(gòu)協(xié)議在BDS階段期間執(zhí)行。BDS體系結(jié)構(gòu)協(xié)議定位并加載在預(yù)引導(dǎo)服務(wù)環(huán)境中所執(zhí)行的各個應(yīng)用。這種應(yīng)用可以表示傳統(tǒng)的OS引導(dǎo)加載器,或擴(kuò)展的服務(wù),所述服務(wù)可以代替加載最終OS或在加載最終OS之前運行。這種擴(kuò)展的預(yù)引導(dǎo)服務(wù)可以包括啟動配置、擴(kuò)展診斷、閃速更新支持、OEM增值或OS引導(dǎo)代碼服務(wù)。在BDS階段期間使用引導(dǎo)調(diào)度器120以便能夠選擇引導(dǎo)目標(biāo),例如要由系統(tǒng)引導(dǎo)的OS。
在TSL階段期間,運行最終的OS引導(dǎo)加載器122以便加載所選擇的OS。一旦已經(jīng)加載OS,那么不再需要引導(dǎo)服務(wù)106,并且不再需要經(jīng)由API 118結(jié)合DXE驅(qū)動器104所提供的許多服務(wù),以及DXE服務(wù)206A。據(jù)此,在OS運行期期間可以訪問的這些縮小的API集被描述為圖1中的API 116A和118A。
如圖1所示,變量服務(wù)持續(xù)至OS運行期。照此,變量服務(wù)API對操作系統(tǒng)可見,因而除了允許在預(yù)引導(dǎo)操作期間由固件動作添加、修改和刪除變量數(shù)據(jù)之外,還允許在OS運行期期間由操作系統(tǒng)動作添加、修改和刪除變量數(shù)據(jù)。典型情況下,把變量數(shù)據(jù)存儲在系統(tǒng)的引導(dǎo)固件裝置(BFD)中。在現(xiàn)代計算機(jī)系統(tǒng)中,BFD通常將包括可重寫非易失性存儲器組件,諸如但不局限于閃速裝置或EEPROM芯片。如這里所用,這些裝置被稱為“非易失性(NV)可重寫存儲裝置”。通常,NV可重寫存儲裝置屬于可以以非易失性方式存儲數(shù)據(jù)(即,當(dāng)計算機(jī)系統(tǒng)沒有操作時保持(維持)數(shù)據(jù))并且提供對數(shù)據(jù)的讀取和寫入訪問的任何裝置。從而,存儲在NV可重寫存儲裝置上的所有或部分固件可以通過把數(shù)據(jù)重寫到為所述裝置定義的適當(dāng)存儲器范圍來更新。
因此,BFD(或輔助固件存儲裝置)的存儲空間的一部分可以被保留來存儲持久數(shù)據(jù),包括變量數(shù)據(jù)。在閃速裝置等情況下,此部分存儲器被稱為“NVRAM”。除在閃速存儲模式下單個位只可以在一個方向上切換以外,NVRAM以類似于常規(guī)隨機(jī)存取存儲器的方式工作。結(jié)果,重置切換位的唯一方式是逐塊“擦除”位組。通常,所有或部分NVRAM可以用于存儲變量數(shù)據(jù);此部分被稱為是變量儲存庫。
如上所述,在EFI下,變量被定義為由識別信息加上屬性(密鑰)和任意數(shù)據(jù)(值)所組成的密鑰/值對。通過變量服務(wù)可以將這些密鑰/值對存儲在NVRAM中,并且可以從NVRAM訪問。存在三個變量服務(wù)函數(shù)GetVariable、GetNextVariableName和SetVariable。GetVariable返回變量值。GetNextVariableName列舉當(dāng)前變量名。SetVariable設(shè)置變量值。GetVariable和SetVariable函數(shù)都使用五個參數(shù)VariableName、VendorGuid(廠商的唯一標(biāo)識符)、Attributes(通過屬性掩碼)、DataSize和Data。Data參數(shù)識別用于寫入或讀取變量的數(shù)據(jù)內(nèi)容的緩沖器(經(jīng)由存儲器地址)。VariableName、VendorGuid參數(shù)使對應(yīng)于特定系統(tǒng)元件(例如,附加卡)的變量易于被識別,并且能夠為相同的組件附加多個變量。
在數(shù)據(jù)庫環(huán)境下,變量數(shù)據(jù)被存儲為2元組<Mi,Bi>,其中在編程閃速裝置之前數(shù)據(jù)字節(jié)(B)常常與某些屬性信息/元數(shù)據(jù)(M)相關(guān)聯(lián)。元數(shù)據(jù)M是實施方式特定的。它可以包括諸如“刪除”等信息,以便允許在變量儲存庫生存期的各個時間對存儲進(jìn)行無用單元收集。元數(shù)據(jù)M并不通過變量服務(wù)API可見,而是僅僅被內(nèi)部使用以便管理存儲。
依照本發(fā)明一方面,以支持壓縮變量以便存儲以及當(dāng)希望訪問變量時相應(yīng)地解壓縮所壓縮的變量的方式來加強(qiáng)上述變量數(shù)據(jù)存儲和訪問模式。結(jié)合數(shù)據(jù)庫術(shù)語,通過經(jīng)由壓縮函數(shù)C來壓縮B(數(shù)據(jù))并且把相關(guān)的壓縮信息添加到元數(shù)據(jù)M以便產(chǎn)生<M′,C(B)>,來加強(qiáng)2元組存儲模式。例如,M′可以包括附加信息,用于識別給定變量是否被壓縮(例如,用于表明“壓縮/未壓縮”的布爾值)和/或識別所使用的特定壓縮算法,諸如“壓縮算法XYZ”。
除壓縮變量數(shù)據(jù)之外,必需需要解壓縮器以便把數(shù)據(jù)返回到原始形式。例如,經(jīng)由解壓縮器D恢復(fù)C(B)被表示為D(C(B))。在今天的計算平臺環(huán)境下,通常以壓縮方式存儲固件的各個部分以便達(dá)到最大存儲效用。結(jié)果,已經(jīng)為這種配置提供了解壓縮器D用于解壓縮所壓縮的固件。此外,如果對于固件部分和變量數(shù)據(jù)使用相同的壓縮/解壓縮模式,那么不必向所述固件提供第二解壓縮器。作為選擇,可以使用獨立的壓縮/解壓縮模式來存儲固件并存儲變量數(shù)據(jù)。在這種情況下,將提供用于固件的獨立的解壓縮器。
相比之下,向固件提供壓縮器是罕見的。原因在于壓縮的固件典型情況下未被壓縮繼而被載入存儲器中以供隨后使用。使用未壓縮固件的好處是用于執(zhí)行系統(tǒng)初始化操作,當(dāng)所述系統(tǒng)初始化操作完成后不再要求基礎(chǔ)固件代碼可用。為了支持操作系統(tǒng)運行期操作,未壓縮的固件代碼只需連同被傳送到OS的適當(dāng)接口信息一起,保留在存儲器中。
依照本發(fā)明的另一方面,使用“渴望”壓縮。更具體地,當(dāng)壓縮器可用時,以壓縮形式存儲變量數(shù)據(jù),而如果壓縮器不可用時以未壓縮形式存儲變量數(shù)據(jù)。結(jié)果,對于SetVariable(B)事務(wù),如果在固件中存在壓縮器算法C,那么存儲C(B);否則以類似于常規(guī)方案的方式存儲B。
在一個實施例中,壓縮器代碼(也叫做壓縮器)位于無容錯塊(典型情況下為容錯更新所保留),這意味著壓縮器丟失可能不會導(dǎo)致整個變量數(shù)據(jù)訪問方案失效。例如,壓縮器代碼可能在容錯更新操作期間由于出現(xiàn)電源故障而丟失。這并不嚴(yán)重,因為任何現(xiàn)有的壓縮變量數(shù)據(jù)仍然能被解壓縮,并且將來對變量數(shù)據(jù)的任何存儲將以常規(guī)的方式執(zhí)行,即,將以上述的<Mi,Bi>2元組格式來存儲數(shù)據(jù)。通過把壓縮器代碼存儲在典型情況下保留給平臺固件的塊之外,與傳統(tǒng)方法相比,這對固件存儲裝置的存儲空間利用來說沒有任何影響。
參考圖3a和3b的流程圖以及圖4的示意圖,依照一個實施例的平臺初始化操作如下進(jìn)行。如開始塊300所描述,所述過程響應(yīng)于系統(tǒng)重置或加電事件而開始。作為響應(yīng),依照上面參考圖1論述的PEI階段,在塊302中所述過程進(jìn)行到早期平臺初始化。更為詳細(xì)地是,在系統(tǒng)的BFD固件裝置(諸如在圖4中示出的示例性512K閃速裝置400)中存儲的固件被執(zhí)行以便進(jìn)行早期初始化。在一個實施例中,此固件以未壓縮形式存儲在閃速裝置400的恢復(fù)塊402中,并且就地執(zhí)行(XIP)?;謴?fù)塊包含從不改變的固件;相比之下,閃速裝置的其它部分包括的塊包含可以經(jīng)由適當(dāng)?shù)母虏僮鱽砀碌墓碳?br>
在EFI環(huán)境下,在PEI階段期間執(zhí)行的固件被存儲在稱作“PEI模塊”或簡稱為“PEIM″的模塊中。首先,響應(yīng)于重置/加電事件,諸如具有Intel 32位體系結(jié)構(gòu)(IA-32)的處理器之類的32位處理器加載重置指令,所述重置指令位于4千兆字節(jié)(GB)32位地址空間的上限。這對應(yīng)于系統(tǒng)BFD的最高地址。據(jù)此,BFD的基地址等于4GB減去裝置的存儲容量,例如對于閃速裝置400減去512k。依照恢復(fù)塊402的64K塊大小,重置指令把指令執(zhí)行路徑導(dǎo)引到在4GB之下16K的地址處(即,閃速裝置400的基地址加上596K)的第一指令處。這與安全模塊(SEC文件)404的位置一致,所述安全模塊404包含用于校驗要加載的各個固件組件的完整性的指令;在圖1中所示出的PE I階段之前所執(zhí)行的SEC階段期間,這些指令就地執(zhí)行。在完成SEC階段時,執(zhí)行路徑被導(dǎo)引到PEI核心文件406的開始。
然后恢復(fù)塊402中的其余固件依照從低到高的塊地址就地執(zhí)行,其中每個模塊的起始地址被存儲在固件卷(FV)首部407中。這包括執(zhí)行PEI核心文件406、存儲器和平臺初始化PEIM 408和410以及DXE初始程序加載(IPL)PEIM 412。執(zhí)行存儲器初始化PEIM能夠訪問系統(tǒng)的存儲器,如系統(tǒng)存儲器414。在一個實施例中,系統(tǒng)保留緊鄰BFD基地址下方的地址空間用于固件“陰影(shadowing)”,”即是在系統(tǒng)存儲器中存儲可執(zhí)行的固件映象以備下述的快速訪問和/或解壓縮目的。系統(tǒng)存儲器414的這一部分被示為固件映象和API 416。
結(jié)合DXE IPL PEIM 412的執(zhí)行,所述模塊被載入固件映象和API416(即,陰影的)中,并且產(chǎn)生配置信息使得對應(yīng)于解壓縮器418的解壓縮函數(shù)的入口點經(jīng)由HOB被傳送到DXE。隨后,執(zhí)行恢復(fù)塊402中的其余固件,包括塊訪問和文件系統(tǒng)恢復(fù)PEIM 420和變量訪問PEIM422,完成PEI階段。變量訪問PEIM能夠在PEI階段期間訪問在NVRAM塊426中存儲的變量424。
接下來,指令執(zhí)行路徑被重定向到包含在位于閃速裝置400的基地址附近固件卷中的固件。此部分固件典型情況下包括在DXE階段期間執(zhí)行的組件,諸如DXE驅(qū)動器和相關(guān)代碼,它們一起被描述為存儲在可替換的固件塊428中(為簡單起見將其示為單個塊)。由可置換的固件塊所占據(jù)的地址范圍從裝置的基地址開始,并且擴(kuò)展到基地址加上320K,即固件裝置400的前五個64K塊。每個組件的起始地址包含在FV首部430內(nèi)。
在DXE階段期間,各個DXE相關(guān)固件組件被加載到系統(tǒng)存儲器中且被執(zhí)行。這些組件包括DXE核心文件432、芯片組DXE驅(qū)動器434、控制臺DXE驅(qū)動器425、變量DXE驅(qū)動器438、兼容性支持DXE驅(qū)動器440和EFI命令解釋程序應(yīng)用442。還加載并執(zhí)行了幾個其它DXE組件;為了清楚在圖4中并沒有示出這些組件。在一個實施例下,存儲在可置換的固件塊428中的固件被壓縮。從而,為了執(zhí)行上述DXE組件,在將它們載入到系統(tǒng)存儲器(在固件映象和API 416)之前必須先解壓縮。這經(jīng)由解壓器418部分地完成。為了清楚起見,在固件映象和API416中沒有示出許多DXE相關(guān)固件組件的解壓縮映象。
結(jié)合變量DXE驅(qū)動器438的解壓縮、加載和執(zhí)行,發(fā)布了變量服務(wù)API 444。此API能夠在剩余的預(yù)引導(dǎo)操作期間和OS運行期期間訪問(即,讀取和寫入)變量424。
除識別在可置換塊428中每個固件組件的位置(即,起始地址)的標(biāo)記之外,F(xiàn)V首部430還包含用于識別被存儲在回收塊448中的壓縮器DXE驅(qū)動器446的位置的標(biāo)記。通常,回收塊用來在容錯固件升級過程期間臨時存儲給定固件塊的拷貝。從而,它通常不包含任何所要求的固件組件,這是因為把它的內(nèi)容設(shè)計成在固件升級期間被擦除并且繼而被重寫。然而在這個實例中,回收塊用來存儲壓縮器DXE驅(qū)動器。作為選擇,壓縮器DXE驅(qū)動器446也可以被存儲在恢復(fù)塊402或可置換的固件塊430中。通常,壓縮器DXE驅(qū)動器446可以依照壓縮或未壓縮格式來存儲,采取哪種格式取決于它的大小和在回收塊448中存儲的任何其它固件。
當(dāng)被加載到系統(tǒng)存儲器中時,壓縮器DXE驅(qū)動器暴露了解壓縮協(xié)議448,所述解壓縮協(xié)議448被引入變量服務(wù)API 444。解壓縮協(xié)議告知變量服務(wù)怎樣解壓縮所壓縮的變量424。
返回到圖3a的流程圖,在執(zhí)行塊304的操作之后,在判定塊306中確定變量424是否存在于NVRAM塊426中。如果回答是否定的,那么預(yù)引導(dǎo)操作繼續(xù)進(jìn)行直到在結(jié)束塊308中啟動引導(dǎo)目標(biāo)(例如,操作系統(tǒng)加載器)。如果變量確實存在,那么邏輯繼續(xù)至圖3b的流程圖以便依照塊309獲取變量。
此過程在塊310中開始,其中通過調(diào)用GetNextVariableName和擴(kuò)充的GetVariable函數(shù)來讀取變量內(nèi)容。特別地是,GetVariable函數(shù)在判定塊312中檢查元數(shù)據(jù)M′以便確定當(dāng)前所考慮的變量是否以壓縮格式存儲。如果所述變量是壓縮的,那么在塊314中使用所描述的解壓縮器418來解壓縮所述變量。如果沒有壓縮變量,那么在塊316中簡單地讀取該變量。不論那種情況,依照結(jié)束塊318,把所述變量返回到調(diào)用者。
在已經(jīng)獲取任何變量之后,在塊320中它們由合適的固件組件來使用。例如,可以使用變量向用戶提供各個引導(dǎo)選項。隨后,邏輯繼續(xù)至結(jié)束塊308以便啟動引導(dǎo)目標(biāo)。
除獲取變量之外,可以添加新的變量數(shù)據(jù)并且可以修改或刪除現(xiàn)有的變量數(shù)據(jù)。這依照圖5的流程圖經(jīng)由SetVariable函數(shù)來完成。在塊500中,經(jīng)由變量服務(wù)API 444的相應(yīng)調(diào)用,變量內(nèi)容被作為Data參數(shù)提供給擴(kuò)充的SetVariable函數(shù)。在判定塊502中,確定是否存在壓縮器。如果回答是肯定的,那么在塊504中經(jīng)由DXE驅(qū)動器壓縮器446來壓縮變量。無論壓縮器是否存在,在判定塊506中確定在變量存儲器(例如,NVRAM塊426)中是否留有足夠空間用于存儲壓縮或未壓縮的變量。如果剩余空間足夠,那么取決于壓縮器的存在與否,所述變量被以壓縮或未壓縮形式寫入到變量存儲器。然后依照返回塊510,過程成功退出,返回到調(diào)用者。如果變量存儲器中的剩余空間不夠,那么依照返回塊512,過程退出并且向調(diào)用者返回錯誤標(biāo)記。
在更新變量的情況下,寫入過程包括兩個步驟。因為在不擦除整個塊的情況下閃速存儲器的位不能被重置,所以通過首先經(jīng)由設(shè)置元數(shù)據(jù)M或M′(視情況而定)中的對應(yīng)位來把現(xiàn)有變量標(biāo)記為刪除,來執(zhí)行變量更新。然后,把新的變量數(shù)據(jù)寫入變量存儲器。
應(yīng)當(dāng)理解的是,隨著時間的推移各個刪除的變量數(shù)據(jù)將累積在變量存儲器中,因而減少了用于存儲新的和/或附加的修改變量數(shù)據(jù)的剩余空間。在一個實施例中,所刪除的變量數(shù)據(jù)可以依照圖6的流程圖被“無用單元收集”。首先在塊600中,把將對其實行無用單元收集的一個或多個塊(例如,NVRAM塊426)的映象拷貝到系統(tǒng)存儲器414中,如NVRAM映象450。然后在塊602中擦除閃速存儲器的所述一個或多個塊。然后對于每個變量執(zhí)行在各自的循環(huán)開始塊604和循環(huán)結(jié)束塊606之間所示出的操作。第一步操作對應(yīng)于判定塊608,其中確定當(dāng)前處理的變量是否被標(biāo)記為刪除。如果被標(biāo)記為刪除,那么依照塊610跳過所述變量,并且過程轉(zhuǎn)而考慮下一變量。對于沒有被標(biāo)記為刪除的每個變量,在塊610中把所述變量添加到固件變量存儲器。此過程涉及為每個未刪除的變量調(diào)用擴(kuò)充的SetVariable函數(shù),以便通過執(zhí)行上面參考圖5描述的操作來把所述變量寫入變量存儲器。重復(fù)此過程直到到達(dá)塊映象的末端。
依照本發(fā)明的另一方面,固件可以被配置為響應(yīng)于固件更新來執(zhí)行重新啟動時壓縮掃描,由此來添加壓縮器。例如,可以使用壓縮掃描來壓縮先前以未壓縮形式存儲在固件裝置中的現(xiàn)有變量數(shù)據(jù)。
在圖7中示出了用于舉例說明依照一個實施例執(zhí)行的操作和邏輯的流程圖,用于執(zhí)行重新啟動時壓縮掃描。所述過程以類似于上述圖3的方式開始,其中塊700、702和704的操作分別類似于塊300、302和304的操作。隨后,在判定塊706中確定是否存在任何未壓縮的變量。如果回答是否定的,那么預(yù)引導(dǎo)初始化過程繼續(xù),最后導(dǎo)致在塊708中啟動引導(dǎo)目標(biāo)。
如果確定未壓縮變量存在,那么邏輯繼續(xù)至塊710,其中把變量存儲塊(例如,NVRAM塊426)的映象拷貝到系統(tǒng)存儲器中。然后在塊712中擦除所述變量存儲塊。然后每個變量由在開始和結(jié)束塊714和716所定義的操作處理。首先,在判定塊718中確定當(dāng)前處理的變量是否是未壓縮的。如果變量是未壓縮的,那么它在塊720中被壓縮并且在塊722中被寫入變量存儲塊(或者如果使用多個變量存儲塊的話,寫入一個可用的存儲塊,其中在一個實施例中,寫入第一塊直到第一塊被寫滿,然后寫入第二塊直到第二塊寫滿等等)。如果變量已經(jīng)被壓縮,那么只簡單地在塊722中將其以壓縮的形式寫入到變量存儲塊。重復(fù)此過程直到已經(jīng)處理所有變量,于是在塊708中繼續(xù)預(yù)引導(dǎo)初始化操作,來啟動引導(dǎo)目標(biāo)。
依照本發(fā)明的另一方面,與上述壓縮/解壓縮類似的模式可以應(yīng)用于變量的加密/解密。在一個實施例中,單獨使用變量的加密與解密。在另一實施例中,并行組合壓縮/解壓縮和加密/解密。
參考圖8,除增加了在回收塊448中所存儲的加密DXE驅(qū)動器800、具有DXE IPL PEIM 412的解密器802和由變量服務(wù)API 444′所引入的解密協(xié)議804之外,支持固件變量數(shù)據(jù)的加密與解密的示例性固件配置包含在圖4中所示出的類似組件。通常,加密DXE驅(qū)動器可以位于存儲器中的任何地方,諸如無容錯塊,而解密器應(yīng)當(dāng)位于不可置換的塊,諸如恢復(fù)塊402。在并行組合壓縮/解壓縮和加密/解密的實施例中,加密DXE驅(qū)動器800和壓縮器DXE驅(qū)動器446存在于回收塊448,而解密器802和解壓縮器418存在于恢復(fù)塊402(未示出)。
實質(zhì)上,加密DXE驅(qū)動器800和解密器802分別以類似于壓縮器DXE驅(qū)動器446和解壓縮器418的方式起作用。在這種情況下,元數(shù)據(jù)M″包含表明變量是否被加密的標(biāo)記,并且把所述數(shù)據(jù)作為具有<M″i,E(Bi)>形式的2元組來存儲。例如,在圖9a中示出了單獨使用加密/解密的讀取操作。此過程在塊900中開始,其中通過調(diào)用GetNextVariableName和擴(kuò)充的GetVariable函數(shù)來讀取變量內(nèi)容。特別地是,在判定塊902中GetVariable函數(shù)檢查元數(shù)據(jù)M″以便確定當(dāng)前所考慮的變量是否以加密形式存儲。如果所述變量的加密的,那么在塊904中使用所描述的解密器802來解密所述變量。如果所述變量沒有加密,那么在塊906中簡單地讀取該變量。不論那種情況,在結(jié)束塊908中,把未加密的變量返回到調(diào)用者。
圖9b的流程圖示出了依照一個實施例的操作和邏輯,其中把壓縮和解壓縮操作添加到圖9a的流程圖。在這個例子中,采用與上述相同的方式來執(zhí)行塊900、902和904的操作,產(chǎn)生未加密的變量。接下來,在判定塊910中確定所述未加密的變量是否被壓縮。如果是的話,那么在塊912中解壓縮所述未加密的變量;否則在塊914中只是簡單地讀取它。然后在結(jié)束塊916中將所產(chǎn)生的未加密和未壓縮的變量返回到調(diào)用者。
在加密解密模式下把變量寫入固件存儲器類似于上述參考圖5的壓縮/解壓縮。在塊1000中,經(jīng)由對變量服務(wù)API 444′的相應(yīng)調(diào)用,變量內(nèi)容被作為Data參數(shù)提供給擴(kuò)充的SetVariable函數(shù)。在判定塊1002中,確定是否存在加密器。如果回答是肯定的,那么在塊1004中經(jīng)由壓縮器DXE驅(qū)動器800來加密變量。無論加密器是否存在,在判定塊1006中確定在變量存儲器(例如,NVRAM塊426)中是否留有足夠空間用于存儲加密或未加密的變量。如果剩余空間足夠,那么取決于加密器的存在與否,所述變量被以加密或未加密的形式寫入到變量存儲器。然后依照返回塊1010,過程成功退出,返回到調(diào)用者。如果變量存儲器中的剩余空間不夠,那么依照返回塊1012過程退出并且向調(diào)用者返回錯誤標(biāo)記。
圖10b的流程圖示出了依照一個實施例的操作和邏輯,其中把壓縮和解壓縮操作添加到圖10a的流程圖。在這個例子中,塊1000、1002和1004的操作以與上述相同的方式執(zhí)行,如果存在加密器的話產(chǎn)生加密的變量,否則產(chǎn)生未加密的變量。然后在判定塊1014中確定所述加密/未加密的變量是否被壓縮。如果是的話,那么在塊1016中壓縮變量并且邏輯流向判定塊1006′;否則邏輯直接進(jìn)行到判定塊1006′。如果在存儲器中留有足夠的空間用于存儲加密/未加密和壓縮/未壓縮的變量,那么在塊1008′中存儲該變量,并且在返回塊1010′中過程成功退出,返回到調(diào)用者。然后在結(jié)束塊916中將所得到的未加密和未壓縮的變量返回給調(diào)用者。如果變量存儲器中的剩余空間不夠,那么在返回塊1012′中過程退出并且向調(diào)用者返回錯誤標(biāo)記。
在上述實施例中,變量首先被加密繼而被壓縮。這只是一個示例性的次序,變量也可以首先被壓縮繼而被加密。在一個實施例中,可以采用對稱加密方案,諸如由高級加密標(biāo)準(zhǔn)(AES)機(jī)構(gòu)的聯(lián)邦信息處理標(biāo)準(zhǔn)(FIPS)197(http/csrc.nist.gov/publications/fips/fips97/fips-197.pdf)。
通常,采用與這里所描述的用于壓縮和加密類似的方式,本發(fā)明的原理可以應(yīng)用于任何類型的固件變量轉(zhuǎn)換。例如,變量可以被轉(zhuǎn)換為包含錯誤校正碼(ECC)數(shù)據(jù)以便防止丟失位。在另一實施例中,為了安全目的可以使用依照數(shù)字簽名模式的轉(zhuǎn)換。此外,可以并行實現(xiàn)多個轉(zhuǎn)換器,諸如函數(shù)F=C1(C2(C3))...等所示,其中C1、C2和C3是相應(yīng)的轉(zhuǎn)換函數(shù)。轉(zhuǎn)換類比還適用于如下的故障保險渴望轉(zhuǎn)換。首先,如果轉(zhuǎn)換器可用,那么用它來轉(zhuǎn)換變量,否則忽略轉(zhuǎn)換。然后,諸如在恢復(fù)塊402中,應(yīng)該以故障保險方式存儲解轉(zhuǎn)換器(即,用于把以轉(zhuǎn)換形式存儲的固件變量恢復(fù)到其未轉(zhuǎn)換形式的組件)。同前面一樣,在一個實施例中,轉(zhuǎn)換器被存儲在固件裝置的無容錯塊中,以致它可能丟失。因為解轉(zhuǎn)換器被安全存儲,所以它將仍可用于恢復(fù)變量數(shù)據(jù)。
還應(yīng)當(dāng)理解的是,所使用的特定轉(zhuǎn)換模式對那些特定轉(zhuǎn)換領(lǐng)域內(nèi)(壓縮,加密,ECC,數(shù)字簽名等)的技術(shù)人員來說是已知的。因此,這里并沒有包括特定轉(zhuǎn)換過程的更多細(xì)節(jié)以免模糊本發(fā)明。
用于實施本發(fā)明實施例的示例性計算機(jī)系統(tǒng)參考圖11,舉例說明了通常常規(guī)的計算機(jī)1100,所述計算機(jī)1100適于用作計算平臺來實施本發(fā)明的實施例。適合實現(xiàn)上述實施例的計算機(jī)的例子包括PC類系統(tǒng)、便攜式計算機(jī)、服務(wù)器和工作站。
如本領(lǐng)域內(nèi)普通技術(shù)人員公知的,計算機(jī)1100包括處理器機(jī)箱1102,其中安裝有軟盤驅(qū)動器1104、硬盤驅(qū)動器1106、母板1108和電源(未示出),所述母板1108組裝有適當(dāng)?shù)募呻娐?,包括存儲?110、一個或多個處理器(CPU)1112、固件存儲裝置1113。應(yīng)當(dāng)理解,硬盤驅(qū)動器806可以包括單個單元或多個硬盤驅(qū)動器,并且可以選擇性地位于在計算機(jī)1100外。計算機(jī)包括監(jiān)視器1114,用于顯示由在計算機(jī)上運行的軟件程序和程序模塊所產(chǎn)生的圖形和文本。鼠標(biāo)1116(或其它指示裝置)可以連接到在處理器機(jī)箱1102后方的串行端口(或總線端口或USB端口),并且來自鼠標(biāo)1116的信號被傳送到母板,以便控制在顯示器上的游標(biāo)以及選擇由計算機(jī)上執(zhí)行的軟件程序和模塊顯示在監(jiān)視器1114上的文字、菜單選項和圖形組件。另外,鍵盤1118與母板耦合,以供用戶輸入影響計算機(jī)上執(zhí)行的軟件運行的文本和命令。計算機(jī)1100還包括網(wǎng)絡(luò)接口卡1120或內(nèi)置網(wǎng)絡(luò)適配器,用于把計算機(jī)連接到計算機(jī)網(wǎng)絡(luò),諸如局域網(wǎng)、廣域網(wǎng)或因特網(wǎng)。
選擇性地,計算機(jī)1100還可以包括光盤只讀存儲器(CD-ROM)驅(qū)動器1122,可以把CD-ROM盤片插入該驅(qū)動器從而可以讀取盤片上的可執(zhí)行文件和數(shù)據(jù)以便轉(zhuǎn)送到存儲器中和/或計算機(jī)1100的硬盤驅(qū)動器1106上的存儲設(shè)備中。還可以包括其它大容量存儲裝置,諸如光學(xué)記錄介質(zhì)或DVD驅(qū)動器。
組成令CPU實現(xiàn)本發(fā)明上述功能的軟件的機(jī)器指令可能分布在軟盤或CD-ROM(或其它存儲介質(zhì))上,并存儲在硬盤驅(qū)動器中直到載入隨機(jī)存取存儲器(RAM)以供CPU執(zhí)行。選擇性地,可以經(jīng)由計算機(jī)網(wǎng)絡(luò)加載所有或部分機(jī)器指令。
存儲在固件存儲裝置1113上的固件指令通常將存儲在相應(yīng)的諸如閃速裝置、EEPROM之類的非易失性可重寫存儲裝置上,所述固件指令可以由處理器1112執(zhí)行以便完成上述的各個固件操作。被具體化為載波的固件也可以經(jīng)由網(wǎng)絡(luò)下載并拷貝到固件裝置(例如,“閃速存儲到閃速裝置”),或可以最初存儲在盤片介質(zhì)上并被拷貝到固件裝置。
從而,本發(fā)明的實施例可以被用作或支持在某種形式的處理核心(諸如計算機(jī)的CPU)上執(zhí)行的固件和軟件指令,或在計算機(jī)可讀介質(zhì)之上或之內(nèi)執(zhí)行或?qū)崿F(xiàn)的固件和軟件指令。計算機(jī)可讀介質(zhì)包括用于以機(jī)器(例如,計算機(jī))可讀形式來存儲或發(fā)送信息的任何機(jī)制。例如,計算機(jī)可讀介質(zhì)可以包括諸如只讀存儲器(ROM);磁盤存儲介質(zhì);光存儲介質(zhì)和閃速存儲裝置等之類的存儲裝置。另外,計算機(jī)可讀介質(zhì)可以包括傳播的信號,諸如電、光、聲或其它形式的傳播信號(例如,載波、紅外信號、數(shù)字信號等)。
以上對本發(fā)明所舉例說明的實施例的描述,包括在摘要中所描述的內(nèi)容,并非意在把本發(fā)明窮舉或限制為所公開的形式。雖然,為了說明性目的在這里描述了本發(fā)明的具體實施例和例子,然而相關(guān)領(lǐng)域內(nèi)的技術(shù)人員將認(rèn)識到,在本發(fā)明的范圍內(nèi)可以進(jìn)行各種等效的修改。
根據(jù)上述詳細(xì)說明可以對本發(fā)明進(jìn)行這些修改。用于下列權(quán)利要求的術(shù)語不應(yīng)當(dāng)被解釋為把本發(fā)明限制為說明書和權(quán)利要求中所公開的具體實施例。相反地,本發(fā)明的范圍完全由下列權(quán)利要求來確定,所述權(quán)利要求依照所建立的權(quán)利要求解釋規(guī)則來理解。
權(quán)利要求
1.一種方法,包括經(jīng)由固件壓縮固件變量數(shù)據(jù)以便生成壓縮的固件變量數(shù)據(jù);并且把所述壓縮的固件變量數(shù)據(jù)存儲在固件存儲裝置中。
2.如權(quán)利要求1所述的方法,還包括從固件存儲裝置獲取壓縮的固件變量數(shù)據(jù);并且解壓縮所述壓縮的固件變量數(shù)據(jù)。
3.如權(quán)利要求1所述的方法,其中所述壓縮的固件變量數(shù)據(jù)包括原始的固件變量數(shù)據(jù),還包括通過執(zhí)行下列操作來利用新的固件變量數(shù)據(jù)來更新原始的固件變量數(shù)據(jù),所述操作包括以壓縮或未壓縮形式之一來把新的固件變量數(shù)據(jù)存儲在固件存儲裝置中;并且把原始的固件變量數(shù)據(jù)標(biāo)記為刪除。
4.如權(quán)利要求3所述的方法,其中把原始的和新的固件變量數(shù)據(jù)存儲在固件存儲裝置的存儲塊中,還包括通過執(zhí)行下列操作來合并在固件塊中的變量數(shù)據(jù),所述操作包括存儲所述存儲塊的映象;擦除所述存儲塊;并且壓縮在存儲塊的映象中沒有被標(biāo)記為刪除的任何變量,并且把它們寫回到所述存儲塊,而跳過被標(biāo)記為刪除的任何變量。
5.如權(quán)利要求1所述的方法,還包括與壓縮的固件變量數(shù)據(jù)一起存儲用以表明該數(shù)據(jù)是被壓縮的標(biāo)記。
6.如權(quán)利要求1所述的方法,其中所述壓縮的固件變量數(shù)據(jù)以<M′i,C(Bi)>的2元組格式存儲,其中M′i包括對應(yīng)于第i個元組的元數(shù)據(jù),Bi包括對應(yīng)于第i個元組的數(shù)據(jù),而C表示壓縮函數(shù)。
7.如權(quán)利要求1所述的方法,還包括提供一個接口,以便使操作系統(tǒng)運行期組件能夠訪問所述壓縮的固件變量數(shù)據(jù)。
8.如權(quán)利要求1所述的方法,還包括在固件變量數(shù)據(jù)被壓縮之前或之后加密該固件變量數(shù)據(jù),以便把所述固件變量數(shù)據(jù)轉(zhuǎn)換為壓縮且加密的形式。
9.一種方法,包括接收存儲第一固件變量的請求;確定壓縮器是否可用于壓縮第一固件變量;并且如果壓縮器可用于壓縮第一固件變量并且把它存儲在固件存儲裝置中,那么使用所述壓縮器,否則如果壓縮器不可用的話,以未壓縮形式把第一固件變量存儲在固件存儲裝置中。
10.如權(quán)利要求9所述的方法,還包括接收存儲第二固件變量的請求;確定壓縮器不再可用;并且以未壓縮形式把第二固件變量存儲在固件存儲裝置中。
11.如權(quán)利要求9所述的方法,其中未壓縮的固件變量以<Mi,Bi>的2元組格式存儲,其中Mi包括對應(yīng)于第i個元組的元數(shù)據(jù),而Bi包括對應(yīng)于第i個元組的數(shù)據(jù),而壓縮的固件變量以<M′i,C(Bi)>的2元組格式存儲,其中M′i包括對應(yīng)于第i個元組的元數(shù)據(jù),所述第i個元組包含用于表明第i個元組被壓縮的標(biāo)記,Bi包括對應(yīng)于第i個元組的數(shù)據(jù),而C表示壓縮函數(shù)。
12.一種方法,包括響應(yīng)于計算機(jī)系統(tǒng)加電或重置事件,掃描計算機(jī)系統(tǒng)中的固件存儲裝置以便查找以未壓縮形式存儲的未壓縮的固件變量;把未壓縮的固件變量轉(zhuǎn)換為壓縮形式。
13.如權(quán)利要求12所述的方法,其中通過執(zhí)行下列操作來把未壓縮的固件變量轉(zhuǎn)換為壓縮形式,所述操作包括復(fù)制其中存儲有未壓縮固件變量的固件存儲塊的映象;擦除所述固件存儲塊;壓縮每個未壓縮的變量;并且把已壓縮的變量寫回到所述固件存儲塊。
14.如權(quán)利要求13所述的方法,還包括對于任何壓縮的固件變量,掃描所述映象;并且把所述壓縮的變量寫回到固件存儲塊。
15.一種方法,包括把第一轉(zhuǎn)換器存儲在固件存儲裝置的無容錯部分中;把第一解轉(zhuǎn)換器存儲在固件存儲裝置的容錯部分中;確定第一轉(zhuǎn)換器是否可用;并且如果確定第一轉(zhuǎn)換器可用,那么以第一轉(zhuǎn)換形式存儲固件變量,否則以未轉(zhuǎn)換的形式存儲所述固件變量。
16.如權(quán)利要求15所述的方法,還包括利用第一解壓縮器來訪問以第一轉(zhuǎn)換形式存儲的固件變量。
17.如權(quán)利要求15所述的方法,還包括把第二轉(zhuǎn)換器存儲在固件存儲裝置的無容錯部分中;把第二解轉(zhuǎn)換器存儲在固件存儲裝置的容錯部分中;確定第二轉(zhuǎn)換器是否可用;并且如果確定第一和第二轉(zhuǎn)換器都可用,那么經(jīng)由第一和第二轉(zhuǎn)換器所執(zhí)行的第一和第二轉(zhuǎn)換操作以組合的轉(zhuǎn)換形式來存儲固件變量,或者如果確定第一轉(zhuǎn)換器可用而第二轉(zhuǎn)換器不可用,那么經(jīng)由第一轉(zhuǎn)換器所執(zhí)行的轉(zhuǎn)換操作以第一轉(zhuǎn)換形式來存儲固件變量,否則如果確定第二轉(zhuǎn)換器可用而第一轉(zhuǎn)換器不可用,那么經(jīng)由第二轉(zhuǎn)換器所執(zhí)行的轉(zhuǎn)換操作以第二轉(zhuǎn)換形式來存儲固件變量。
18.一種制造產(chǎn)品,包括其上存儲有指令的計算機(jī)可讀介質(zhì),所述指令在執(zhí)行時通過執(zhí)行下列操作使存儲固件變量數(shù)據(jù)便于進(jìn)行,所述操作包括接收存儲固件變量數(shù)據(jù)的請求;壓縮固件變量數(shù)據(jù)以便生成壓縮的固件變量數(shù)據(jù);并且把所述壓縮的固件變量數(shù)據(jù)存儲在固件存儲裝置中。
19.如權(quán)利要求18所述的制造產(chǎn)品,其中執(zhí)行所述指令還進(jìn)行以下操作從固件存儲裝置獲取壓縮的固件變量數(shù)據(jù);并且解壓縮所述壓縮的固件變量數(shù)據(jù)。
20.如權(quán)利要求19所述的制造產(chǎn)品,其中所述指令包括固件。
21.如權(quán)利要求20所述的制造產(chǎn)品,其中所述產(chǎn)品包括閃速存儲器。
22.一種制造產(chǎn)品,包括其上存儲有指令的計算機(jī)可讀介質(zhì),所述指令在執(zhí)行時通過執(zhí)行下列操作使存儲固件變量便于進(jìn)行,所述操作包括接收存儲第一固件變量的請求;確定壓縮器是否可用于壓縮第一固件變量;并且如果壓縮器可用于壓縮第一固件變量并且把它存儲在固件存儲裝置中,那么使用所述壓縮器,否則如果壓縮器不可用的話,以未壓縮形式把第一固件變量存儲在固件存儲裝置中。
23.如權(quán)利要求22所述的制造產(chǎn)品,其中所述產(chǎn)品包括閃速存儲器。
24.如權(quán)利要求23所述的制造產(chǎn)品,其中所述指令的一部分包括用于壓縮固件變量的壓縮器,并且閃速存儲器包括其中存儲有壓縮器的無容錯存儲塊。
25.如權(quán)利要求24所述的制造產(chǎn)品,其中執(zhí)行所述指令還進(jìn)行以下操作接收存儲第二固件變量的請求;確定壓縮器不再可用;并且以未壓縮形式把第二固件變量存儲在固件存儲裝置中。
26.如權(quán)利要求23所述的制造產(chǎn)品,其中所述指令的一部分包括用于對壓縮的固件變量進(jìn)行解壓縮的解壓縮器,并且閃速存儲器包括其中存儲有解壓縮器的容錯存儲塊。
27.一種計算機(jī)系統(tǒng),包括母板;處理器,與母板耦合;易失性存儲器,與母板耦合;和引導(dǎo)固件裝置,與母板耦合并且包括閃速存儲器,所述閃速存儲器在其中存儲有包括壓縮器的固件組件,所述固件組件包括當(dāng)由處理器執(zhí)行時通過執(zhí)行以下操作實現(xiàn)固件變量存儲的指令,所述操作包括發(fā)布接口;經(jīng)由所述接口接收存儲固件變量的請求;確定壓縮器是否可用于壓縮所述固件變量;并且如果壓縮器可用于壓縮第一固件變量并且把它存儲在引導(dǎo)固件裝置中,那么使用所述壓縮器,否則如果壓縮器不可用,那么以未壓縮形式把固件變量存儲在引導(dǎo)固件裝置中。
28.如權(quán)利要求27所述的計算機(jī)系統(tǒng),其中所述指令的一部分包括用于對壓縮的固件變量進(jìn)行解壓縮的解縮壓器。
29.如權(quán)利要求28所述的計算機(jī)系統(tǒng),其中壓縮器被存儲在引導(dǎo)固件裝置的無容錯塊中,而解縮壓器被存儲在引導(dǎo)固件裝置的不可更新塊中。
30.如權(quán)利要求27所述的計算機(jī)系統(tǒng),其中執(zhí)行所述指令還進(jìn)行以下操作接收來自請求者讀取在引導(dǎo)固件裝置中所存儲的固件變量的請求;確定所述固件變量是以壓縮形式還是以未壓縮形式存儲;并且如果所述固件變量以壓縮形式存儲,那么解壓縮所述固件變量以便生成未壓縮的固件變量,并且向請求者提供該未壓縮的固件變量,否則如果所述固件變量以未壓縮形式存儲,那么向請求者提供所述固件變量。
全文摘要
用于把轉(zhuǎn)換的固件變量存儲在諸如閃速存儲器的固件存儲裝置中的基于固件的轉(zhuǎn)換方法。在一個方法下,執(zhí)行對固件的“渴望”壓縮。響應(yīng)于存儲請求,確定壓縮器是否可用。如果可用的話,那么以壓縮形式把固件變量存儲在存儲裝置中;如果不可用的話,那么以未壓縮形式存儲固件變量。響應(yīng)于對所存儲固件變量的讀取請求,確定所述變量是以壓縮形式還是以未壓縮形式存儲。如果是壓縮形式,那么在把它提供給請求者之前,使用解壓縮器把所述變量返回到未壓縮形式;把已經(jīng)是未壓縮形式的變量直接提供給所述請求者。提供了應(yīng)用程序接口以便使操作系統(tǒng)能在運行期訪問所述固件變量??梢元毩⒌鼗虿⑿械厥褂妙愃频霓D(zhuǎn)換,包括加密。
文檔編號H03M7/30GK1809813SQ200480016970
公開日2006年7月26日 申請日期2004年5月26日 優(yōu)先權(quán)日2003年6月16日
發(fā)明者V·齊默, M·羅思曼, G·米勒, M·多蘭 申請人:英特爾公司