利用渴望压缩、故障保险提取和重新启动时压缩扫描来存储固件变量的方法

文档序号:7508065阅读:195来源:国知局
专利名称:利用渴望压缩、故障保险提取和重新启动时压缩扫描来存储固件变量的方法
技术领域
本发明总体上涉及计算机系统,并且更特别地而并非仅仅涉及以压缩形式在固件中存储变量数据的方案。
背景技术
在初始化计算机系统期间使用计算机平台固件来检验系统的完整性和配置。通常还提供那些计算机系统的硬件和软件组件之间基本的低级接口,使得通过执行计算机系统上运行的计算机程序中包含的较高层次的软件指令能够实现具体的硬件功能。在许多计算机中,此固件的主要部分被称为计算机系统的基本输入/输出系统(BIOS)代码。BIOS代码包括一组持久记录的(或者在使用闪速BIOS的系统的情况下半持久记录的)向系统提供其基本操作特性的软件例程,所述软件例程包括告诉计算机当开启时怎样测试自身的指令,以及怎样确定各个内置组件和附加外围设备的配置的指令。
在典型的PC体系结构中,BIOS通常被定义为在处理器重置和操作系统(OS)加载器的第一条指令之间运行的固件。这对应于在冷启动期间或响应于系统重置期间所执行的启动操作。在冷启动初始时刻,除处理器和固件之外实际上只初始化了很少的系统。固件中的代码把系统初始化到这样的程度,即是可以接管诸如硬盘之类的介质所卸载的操作系统。
典型情况下,以包括单个代码集的“单片”形式存储固件代码,所述代码集由平台制造商或BIOS厂商(诸如Phoenix或AMI)提供。单个代码集的各个部分被用来初始化不同的系统组件,而其它部分用于运行期(即,引导后)操作。在其它情况中,可以使用一个或多个“选件ROM”来扩展单片BIOS,所述“选件ROM”包含在一个或多个外围装置卡(也叫做“内插”卡)上。例如,SCSI装置驱动卡和视频卡常常包括选件ROM,所述选件ROM包含对应于由这些卡所提供的服务的BIOS代码。典型情况下,依照预定义模式在已经加载了单片BIOS中的固件之后或在加载单片BIOS期间,加载选件ROM中的固件。
今天的固件体系结构包括用于扩展除由存储在平台BIOS装置(例如,闪速存储器)中的BIOS代码提供的BIOS功能之外的BIOS功能的设备。更特别地是,可扩展固件接口(EFI)(在http//developer.intel.com/technology/efi可以找到其规范和例子)是用于描述在平台固件和压缩-包装操作系统或其它定制应用环境之间的抽象编程接口的公共工业规范。EFI框架包括用于扩展除由存储在平台BIOS装置(例如,闪速存储器)中的BIOS代码所提供之外的BIOS功能的设备。EFI使固件模块和驱动器形式的固件能够从各种不同的资源中加载,包括主要和次要闪速装置、选件ROM、各种持久性存储装置(例如,硬盘、CD ROM等),甚至经由计算机网络。
EF I的特征之一是,EFI提供了用于存储平台固件中的持久值的抽象,称为“变量”。变量被定义为由识别信息加上属性(密钥)和任意数据(值)所组成的密钥/值对。变量意在被用为存储在平台中所实现的EFI环境和EFI OS加载器及其它在EFI环境中运行的应用之间所传送的数据的手段。尽管变量存储的实现方式在EFI规范中没有定义,然而在大多数情况下变量必须是持久性的。这意味着平台上的EF I实施方式必需设置变量的存储方式,使得为了存储而传送进来的变量被保留且至少直到它们被明确地删除或重写,在此期间变量可以用于每次系统启动。在某些平台上此类非易失性存储器装置可能很有限,在不能使用其它用于传递信息的装置的情况下通常要求节约地使用变量。


参考下列详细说明结合附图,本发明的上述方面和许多附带的优点将变得更容易理解,其中除非另作说明遍及各个附图,相同的附图标记指的是相同的部件图1是举例说明依照可扩展固件接口(EFI)架构所执行的各个执行阶段的示意图;图2是举例说明由本发明的实施例在固件变量访问期间所使用的EFI系统表的各个组件的框图;
图3a是依照本发明的一个实施例举例说明在系统初始化期间为加载固件变量所执行的逻辑和操作的流程图;图3b是依照本发明的一个实施例举例说明在固件变量读取过程期间所执行的逻辑和操作的流程图;图4是依照本发明的一个实施例举例说明用于支持压缩/解压缩操作的固件组件的配置的示意图;图5是依照本发明一个实施例举例说明在固件变量写入过程期间所执行的逻辑和操作的流程图,其中在所述固件变量写入过程下利用渴望压缩(eager compression)存储变量;图6是依照本发明一个实施例举例说明在固件变量合并过程期间所执行的逻辑和操作的流程图;图7是依照本发明一个实施例举例说明在重新启动变量压缩扫描过程期间所执行的逻辑和操作的流程图;图8是依照本发明的一个实施例举例说明用于支持加密/解密操作的固件组件的配置的示意图;图9a是依照本发明的一个实施例举例说明在固件变量读取操作期间所执行的逻辑和操作的流程图,在所述固件变量读取操作中可以获取加密和未加密的变量;图9b是依照本发明的一个实施例与图9a类似的流程图,其中还添加了压缩/解压缩操作以便能够获取加密/未加密和压缩/未压缩的变量;图10a是依照本发明一个实施例举例说明在固件变量写入过程期间所执行的逻辑和操作的流程图,在所述固件变量写入过程内使用渴望的加密来存储变量;图10b是依照本发明一个实施例举例说明在固件变量写入过程期间所执行的逻辑和操作的流程图,在所述固件变量写入过程内使用渴望的加密和渴望的压缩的组合来存储变量;图11是举例说明可以用于实现这里所公开的本发明实施例的示例性计算机系统的示意图。
具体实施例方式
这里描述了对应于利用压缩和故障保险提取来存储固件变量的模式的方法、固件和计算机系统的实施例。在下面描述中,阐明了许多具体细节以便提供对本发明更彻底的了解。然而,相关领域的技术人员将认识到可以在没有一个或多个具体细节的情况下或用其它方法、组件、材料等实施本发明。在其它实例中,没有详细示出或描述众所周知的结构、材料或操作以免模糊本发明的特征。
遍及整个说明书,对“一个实施例”或“一实施例”的引用意味着联合实施例描述的特定特征、结构或特性包含在本发明的至少一个实施例中。因此,在整个说明书中不同位置出现的短语“在一个实施例中”或“在一实施例中”不必都参照相同的实施例。此外,可以在一个或多个实施例中以任何适当的方式组合特定的特征、结构或特性。
依照本发明一方面,公开了一种架构所述架构提供了能够压缩并且故障保险提取固件变量的机制。本发明的实施例提供了一种手段,借此如果压缩器丢失,那么依照可以无缝降级(即,故障保险)的方式,经由解压缩/压缩虚拟化平台的闪速存储。
依照一个实施例,该架构是经由EFI所提供的设备来实现的。图1示出了一个事件顺序/结构图,用于举例说明由EFI兼容架构下的平台响应于冷启动(例如,电源关/开重置)所执行的操作。所述过程逻辑上被分成几个阶段,包括预EFI初始化环境(PEI)阶段、驱动器执行环境(DXE)阶段、引导装置选择(BDS)阶段、瞬时系统加载(TSL)阶段和操作系统运行期(RT)阶段。所述阶段彼此依赖以便向OS和平台提供适当的运行期环境。
PEI阶段向处理器(CPU)、芯片组和母板提供了用于加载并调用具体初始配置例程的标准化方法。PEI阶段负责足够地初始化系统以便为下面阶段提供稳定的基础。在PEI阶段期间执行平台核心组件的初始化,所述平台核心组件包括CPU、芯片组和主板(即,母板)。此阶段还被称为“早期初始化”阶段。在此阶段期间所执行的典型操作包括POST(加电自检)操作,以及发现平台资源。特别地是,PEI阶段发现存储器并且准备被切换到DXE阶段的资源映射。在PEI阶段结束时的系统状态经由一列位置无关的数据结构(称作切换块(Hand Off Block HOB))被传送到DXE阶段。
DXE阶段是执行大部分系统初始化的阶段。由包括DXE核心100、DXE调度器102和一组DXE驱动器104的几个组件来使DXE阶段便于进行。DXE核心100生成一组引导服务106、运行期服务108和DXE服务110。DXE调度器102负责发现并以正确的次序执行DXE驱动器104。DXE驱动器104负责初始化处理器、芯片组和平台组件,以及向控制台和引导装置提供软件抽象。这些组件一起运行以便初始化平台并且提供引导操作系统所需的服务。DXE和引导设备选择阶段一起运行以便建立控制台并且试图引导操作系统。当操作系统成功开始其引导过程时(即,BDS阶段开始),终止DXE阶段。只允许运行期服务和所选择的由DXE核心提供的DXE服务以及所选择的由运行期DXE驱动器提供的服务持续到OS运行期环境。DXE的结果是完全成形的EFI接口的表示。
DXE核心被设计成完全可移植的,而没有CPU、芯片组或平台相关性。这通过几个特征的设计来实现。第一,DXE核心只依赖于其初始状态的HOB列表。这意味着DXE核心不依赖于来自先前阶段的任何服务,所以一旦所述HOB列表被传送到DXE核心所有先前阶段可以被卸载。第二,DXE核心不包含任何硬编码的地址。这意味着DXE核心可以被加载到物理存储器中的任何地方,并且不管物理存储器或固件段在处理器的物理地址空间中位于哪里,它都能够正确工作。第三,DXE核心不包含任何具体CPU、具体芯片组或具体平台的信息。相反,DXE核心是通过一组体系结构协议接口从系统硬件中抽象出来的。这些体系结构协议接口由DXE驱动器104生成,所述DXE驱动器104由DXE调度器102调用。
DXE核心生成EFI系统表200及其相关联的引导服务106和运行期服务108的集合,如图2所示。DXE核心还保持一句柄数据库202。所述句柄数据库包括一个或多个句柄的列表,其中句柄是一个或多个唯一协议GUID(全局唯一标识符)的列表,所述GUID映射到各自的协议204。协议是服务集的软件抽象。某些协议抽象I/O装置,以及其它协议抽象通用的系统服务集。典型情况下,协议包含一组API和一些数据字段。每个协议由GUID命名,并且DXE核心生成允许协议在句柄数据库注册的服务。当DXE调度器执行DXE驱动器,附加协议将被添加到包括体系结构协议的句柄数据库,所述体系结构协议用于根据平台的具体情况来抽象DXE核心。
引导服务包括在DXE和BDS阶段期间所使用的服务集。其中,这些服务包括存储器服务、协议句柄服务和驱动器支持服务。存储器服务提供服务以便分配和释放存储页面,以及以字节界限分配和释放存储池。存储器服务还提供了用于获取在平台中所有当前物理存储器使用情况的映射的服务。协议句柄服务提供了用于从句柄数据库添加和删除句柄的服务。还提供了根据句柄数据库中的句柄来添加和删除协议的服务。附加服务可用于允许任何组件查找句柄数据库中的句柄,以及开放和关闭句柄数据库中的协议。支持服务提供了用于把驱动器与平台中的装置连接和断开的服务。BDS阶段使用这些服务以便把所有驱动器连接到所有装置,或者只把最小数目的驱动器连接到所要求的装置以便建立控制台并且引导操作系统(即,以便支持快速引导机制)。
与引导服务对比,运行期服务在预引导和OS运行期操作期间都可用。由这里所公开的实施例支持的运行期服务之一是变量服务。如下面进一步详述,变量服务提供了从易失和非易失性存储器中查找、添加和删除环境变量的服务。如这里所用,变量服务被称为“通用的”,这是因为它独立于任何本发明实施例为其更新固件的系统组件。
DXE服务表包括对应于只在预引导期间可用的第一DXE服务集206A和在预引导和OS运行期都可用的第二DXE服务集206B的数据。只在预引导期间可用的服务包括全局一致性域服务,其提供对平台中的I/O资源、存储映象的I/O资源和系统存储器资源进行管理的服务。还包括的是DXE调度器服务,其提供了对被DXE调度器所调度的DXE驱动器进行管理的服务。
由引导服务106、运行期服务108和DXE服务110中的每个所提供的服务经由各自的API集112、114和116访问。API提供了抽象接口,所述抽象接口使得随后加载的组件能支持所选择的、由DXE核心所提供的服务。
在初始化DXE核心100之后,控制交给DXE调度器102。DXE调度器负责加载和调用在固件卷中找到的DXE驱动器,所述固件卷对应于在EFI架构下从其加载固件的逻辑存储单元。DXE调度器在由HOB列表所描述的固件卷中搜索驱动器。随着执行的继续,可以定位其它固件卷。当定位它们时,调度器也搜索它们的驱动器。
存在两个DXE驱动器子类。第一子类包括在DXE阶段中很早执行的DXE驱动器。这些DXE驱动器的执行次序取决于先验文件的存在和内容以及对相关性表达的估计。这些早期DXE驱动器典型情况下会包含处理器、芯片组和平台初始化代码。这些早期驱动器典型情况下还会生成体系结构协议,DXE核心需要所述体系结构协议来生成引导服务和运行期服务的完整补充。
第二类DXE驱动器是那些符合EFI 1.10驱动器模型的驱动器。这些驱动器当由DXE调度器执行时,不执行任何硬件初始化。作为替代,它们在句柄数据库中注册驱动器绑定协议接口。驱动器绑定协议集由BDS阶段使用来把驱动器连接到建立控制台和提供对引导装置访问所需的装置上。符合EFI 1.10驱动器模型的DXE驱动器最终向控制台装置和引导装置提供软件抽象,当它们被明确要求这样做时。
任何DXE驱动器可能消耗引导服务和运行期服务以便执行它们的功能。然而,早期DXE驱动器需要知道当它们执行时不是所有的这些服务都可用,这是因为可能尚未注册所有的体系结构协议。在执行之前DXE驱动器必须使用相关性表达以便保证它们所要求的服务和协议接口是可用的。
对于符合EFI 1.10驱动器模型的DXE驱动器不必考虑这种可能性。这些驱动器在执行时简单地在句柄数据库中注册驱动器绑定协议。此操作可以在不使用任何体系结构协议的情况下执行。结合注册驱动器绑定协议,DXE驱动器可以通过使用InstallConfigurationTable函数来“发布(publish)”API。这个发布的驱动器由API 118来描述。在EFI下,发布API使得该API可由其它固件组件访问。API向装置、总线或服务提供接口,在它们各自的生存期DXE驱动器与它们对应。
BDS体系结构协议在BDS阶段期间执行。BDS体系结构协议定位并加载在预引导服务环境中所执行的各个应用。这种应用可以表示传统的OS引导加载器,或扩展的服务,所述服务可以代替加载最终OS或在加载最终OS之前运行。这种扩展的预引导服务可以包括启动配置、扩展诊断、闪速更新支持、OEM增值或OS引导代码服务。在BDS阶段期间使用引导调度器120以便能够选择引导目标,例如要由系统引导的OS。
在TSL阶段期间,运行最终的OS引导加载器122以便加载所选择的OS。一旦已经加载OS,那么不再需要引导服务106,并且不再需要经由API 118结合DXE驱动器104所提供的许多服务,以及DXE服务206A。据此,在OS运行期期间可以访问的这些缩小的API集被描述为图1中的API 116A和118A。
如图1所示,变量服务持续至OS运行期。照此,变量服务API对操作系统可见,因而除了允许在预引导操作期间由固件动作添加、修改和删除变量数据之外,还允许在OS运行期期间由操作系统动作添加、修改和删除变量数据。典型情况下,把变量数据存储在系统的引导固件装置(BFD)中。在现代计算机系统中,BFD通常将包括可重写非易失性存储器组件,诸如但不局限于闪速装置或EEPROM芯片。如这里所用,这些装置被称为“非易失性(NV)可重写存储装置”。通常,NV可重写存储装置属于可以以非易失性方式存储数据(即,当计算机系统没有操作时保持(维持)数据)并且提供对数据的读取和写入访问的任何装置。从而,存储在NV可重写存储装置上的所有或部分固件可以通过把数据重写到为所述装置定义的适当存储器范围来更新。
因此,BFD(或辅助固件存储装置)的存储空间的一部分可以被保留来存储持久数据,包括变量数据。在闪速装置等情况下,此部分存储器被称为“NVRAM”。除在闪速存储模式下单个位只可以在一个方向上切换以外,NVRAM以类似于常规随机存取存储器的方式工作。结果,重置切换位的唯一方式是逐块“擦除”位组。通常,所有或部分NVRAM可以用于存储变量数据;此部分被称为是变量储存库。
如上所述,在EFI下,变量被定义为由识别信息加上属性(密钥)和任意数据(值)所组成的密钥/值对。通过变量服务可以将这些密钥/值对存储在NVRAM中,并且可以从NVRAM访问。存在三个变量服务函数GetVariable、GetNextVariableName和SetVariable。GetVariable返回变量值。GetNextVariableName列举当前变量名。SetVariable设置变量值。GetVariable和SetVariable函数都使用五个参数VariableName、VendorGuid(厂商的唯一标识符)、Attributes(通过属性掩码)、DataSize和Data。Data参数识别用于写入或读取变量的数据内容的缓冲器(经由存储器地址)。VariableName、VendorGuid参数使对应于特定系统元件(例如,附加卡)的变量易于被识别,并且能够为相同的组件附加多个变量。
在数据库环境下,变量数据被存储为2元组<Mi,Bi>,其中在编程闪速装置之前数据字节(B)常常与某些属性信息/元数据(M)相关联。元数据M是实施方式特定的。它可以包括诸如“删除”等信息,以便允许在变量储存库生存期的各个时间对存储进行无用单元收集。元数据M并不通过变量服务API可见,而是仅仅被内部使用以便管理存储。
依照本发明一方面,以支持压缩变量以便存储以及当希望访问变量时相应地解压缩所压缩的变量的方式来加强上述变量数据存储和访问模式。结合数据库术语,通过经由压缩函数C来压缩B(数据)并且把相关的压缩信息添加到元数据M以便产生<M′,C(B)>,来加强2元组存储模式。例如,M′可以包括附加信息,用于识别给定变量是否被压缩(例如,用于表明“压缩/未压缩”的布尔值)和/或识别所使用的特定压缩算法,诸如“压缩算法XYZ”。
除压缩变量数据之外,必需需要解压缩器以便把数据返回到原始形式。例如,经由解压缩器D恢复C(B)被表示为D(C(B))。在今天的计算平台环境下,通常以压缩方式存储固件的各个部分以便达到最大存储效用。结果,已经为这种配置提供了解压缩器D用于解压缩所压缩的固件。此外,如果对于固件部分和变量数据使用相同的压缩/解压缩模式,那么不必向所述固件提供第二解压缩器。作为选择,可以使用独立的压缩/解压缩模式来存储固件并存储变量数据。在这种情况下,将提供用于固件的独立的解压缩器。
相比之下,向固件提供压缩器是罕见的。原因在于压缩的固件典型情况下未被压缩继而被载入存储器中以供随后使用。使用未压缩固件的好处是用于执行系统初始化操作,当所述系统初始化操作完成后不再要求基础固件代码可用。为了支持操作系统运行期操作,未压缩的固件代码只需连同被传送到OS的适当接口信息一起,保留在存储器中。
依照本发明的另一方面,使用“渴望”压缩。更具体地,当压缩器可用时,以压缩形式存储变量数据,而如果压缩器不可用时以未压缩形式存储变量数据。结果,对于SetVariable(B)事务,如果在固件中存在压缩器算法C,那么存储C(B);否则以类似于常规方案的方式存储B。
在一个实施例中,压缩器代码(也叫做压缩器)位于无容错块(典型情况下为容错更新所保留),这意味着压缩器丢失可能不会导致整个变量数据访问方案失效。例如,压缩器代码可能在容错更新操作期间由于出现电源故障而丢失。这并不严重,因为任何现有的压缩变量数据仍然能被解压缩,并且将来对变量数据的任何存储将以常规的方式执行,即,将以上述的<Mi,Bi>2元组格式来存储数据。通过把压缩器代码存储在典型情况下保留给平台固件的块之外,与传统方法相比,这对固件存储装置的存储空间利用来说没有任何影响。
参考图3a和3b的流程图以及图4的示意图,依照一个实施例的平台初始化操作如下进行。如开始块300所描述,所述过程响应于系统重置或加电事件而开始。作为响应,依照上面参考图1论述的PEI阶段,在块302中所述过程进行到早期平台初始化。更为详细地是,在系统的BFD固件装置(诸如在图4中示出的示例性512K闪速装置400)中存储的固件被执行以便进行早期初始化。在一个实施例中,此固件以未压缩形式存储在闪速装置400的恢复块402中,并且就地执行(XIP)。恢复块包含从不改变的固件;相比之下,闪速装置的其它部分包括的块包含可以经由适当的更新操作来更新的固件。
在EFI环境下,在PEI阶段期间执行的固件被存储在称作“PEI模块”或简称为“PEIM″的模块中。首先,响应于重置/加电事件,诸如具有Intel 32位体系结构(IA-32)的处理器之类的32位处理器加载重置指令,所述重置指令位于4千兆字节(GB)32位地址空间的上限。这对应于系统BFD的最高地址。据此,BFD的基地址等于4GB减去装置的存储容量,例如对于闪速装置400减去512k。依照恢复块402的64K块大小,重置指令把指令执行路径导引到在4GB之下16K的地址处(即,闪速装置400的基地址加上596K)的第一指令处。这与安全模块(SEC文件)404的位置一致,所述安全模块404包含用于校验要加载的各个固件组件的完整性的指令;在图1中所示出的PE I阶段之前所执行的SEC阶段期间,这些指令就地执行。在完成SEC阶段时,执行路径被导引到PEI核心文件406的开始。
然后恢复块402中的其余固件依照从低到高的块地址就地执行,其中每个模块的起始地址被存储在固件卷(FV)首部407中。这包括执行PEI核心文件406、存储器和平台初始化PEIM 408和410以及DXE初始程序加载(IPL)PEIM 412。执行存储器初始化PEIM能够访问系统的存储器,如系统存储器414。在一个实施例中,系统保留紧邻BFD基地址下方的地址空间用于固件“阴影(shadowing)”,”即是在系统存储器中存储可执行的固件映象以备下述的快速访问和/或解压缩目的。系统存储器414的这一部分被示为固件映象和API 416。
结合DXE IPL PEIM 412的执行,所述模块被载入固件映象和API416(即,阴影的)中,并且产生配置信息使得对应于解压缩器418的解压缩函数的入口点经由HOB被传送到DXE。随后,执行恢复块402中的其余固件,包括块访问和文件系统恢复PEIM 420和变量访问PEIM422,完成PEI阶段。变量访问PEIM能够在PEI阶段期间访问在NVRAM块426中存储的变量424。
接下来,指令执行路径被重定向到包含在位于闪速装置400的基地址附近固件卷中的固件。此部分固件典型情况下包括在DXE阶段期间执行的组件,诸如DXE驱动器和相关代码,它们一起被描述为存储在可替换的固件块428中(为简单起见将其示为单个块)。由可置换的固件块所占据的地址范围从装置的基地址开始,并且扩展到基地址加上320K,即固件装置400的前五个64K块。每个组件的起始地址包含在FV首部430内。
在DXE阶段期间,各个DXE相关固件组件被加载到系统存储器中且被执行。这些组件包括DXE核心文件432、芯片组DXE驱动器434、控制台DXE驱动器425、变量DXE驱动器438、兼容性支持DXE驱动器440和EFI命令解释程序应用442。还加载并执行了几个其它DXE组件;为了清楚在图4中并没有示出这些组件。在一个实施例下,存储在可置换的固件块428中的固件被压缩。从而,为了执行上述DXE组件,在将它们载入到系统存储器(在固件映象和API 416)之前必须先解压缩。这经由解压器418部分地完成。为了清楚起见,在固件映象和API416中没有示出许多DXE相关固件组件的解压缩映象。
结合变量DXE驱动器438的解压缩、加载和执行,发布了变量服务API 444。此API能够在剩余的预引导操作期间和OS运行期期间访问(即,读取和写入)变量424。
除识别在可置换块428中每个固件组件的位置(即,起始地址)的标记之外,FV首部430还包含用于识别被存储在回收块448中的压缩器DXE驱动器446的位置的标记。通常,回收块用来在容错固件升级过程期间临时存储给定固件块的拷贝。从而,它通常不包含任何所要求的固件组件,这是因为把它的内容设计成在固件升级期间被擦除并且继而被重写。然而在这个实例中,回收块用来存储压缩器DXE驱动器。作为选择,压缩器DXE驱动器446也可以被存储在恢复块402或可置换的固件块430中。通常,压缩器DXE驱动器446可以依照压缩或未压缩格式来存储,采取哪种格式取决于它的大小和在回收块448中存储的任何其它固件。
当被加载到系统存储器中时,压缩器DXE驱动器暴露了解压缩协议448,所述解压缩协议448被引入变量服务API 444。解压缩协议告知变量服务怎样解压缩所压缩的变量424。
返回到图3a的流程图,在执行块304的操作之后,在判定块306中确定变量424是否存在于NVRAM块426中。如果回答是否定的,那么预引导操作继续进行直到在结束块308中启动引导目标(例如,操作系统加载器)。如果变量确实存在,那么逻辑继续至图3b的流程图以便依照块309获取变量。
此过程在块310中开始,其中通过调用GetNextVariableName和扩充的GetVariable函数来读取变量内容。特别地是,GetVariable函数在判定块312中检查元数据M′以便确定当前所考虑的变量是否以压缩格式存储。如果所述变量是压缩的,那么在块314中使用所描述的解压缩器418来解压缩所述变量。如果没有压缩变量,那么在块316中简单地读取该变量。不论那种情况,依照结束块318,把所述变量返回到调用者。
在已经获取任何变量之后,在块320中它们由合适的固件组件来使用。例如,可以使用变量向用户提供各个引导选项。随后,逻辑继续至结束块308以便启动引导目标。
除获取变量之外,可以添加新的变量数据并且可以修改或删除现有的变量数据。这依照图5的流程图经由SetVariable函数来完成。在块500中,经由变量服务API 444的相应调用,变量内容被作为Data参数提供给扩充的SetVariable函数。在判定块502中,确定是否存在压缩器。如果回答是肯定的,那么在块504中经由DXE驱动器压缩器446来压缩变量。无论压缩器是否存在,在判定块506中确定在变量存储器(例如,NVRAM块426)中是否留有足够空间用于存储压缩或未压缩的变量。如果剩余空间足够,那么取决于压缩器的存在与否,所述变量被以压缩或未压缩形式写入到变量存储器。然后依照返回块510,过程成功退出,返回到调用者。如果变量存储器中的剩余空间不够,那么依照返回块512,过程退出并且向调用者返回错误标记。
在更新变量的情况下,写入过程包括两个步骤。因为在不擦除整个块的情况下闪速存储器的位不能被重置,所以通过首先经由设置元数据M或M′(视情况而定)中的对应位来把现有变量标记为删除,来执行变量更新。然后,把新的变量数据写入变量存储器。
应当理解的是,随着时间的推移各个删除的变量数据将累积在变量存储器中,因而减少了用于存储新的和/或附加的修改变量数据的剩余空间。在一个实施例中,所删除的变量数据可以依照图6的流程图被“无用单元收集”。首先在块600中,把将对其实行无用单元收集的一个或多个块(例如,NVRAM块426)的映象拷贝到系统存储器414中,如NVRAM映象450。然后在块602中擦除闪速存储器的所述一个或多个块。然后对于每个变量执行在各自的循环开始块604和循环结束块606之间所示出的操作。第一步操作对应于判定块608,其中确定当前处理的变量是否被标记为删除。如果被标记为删除,那么依照块610跳过所述变量,并且过程转而考虑下一变量。对于没有被标记为删除的每个变量,在块610中把所述变量添加到固件变量存储器。此过程涉及为每个未删除的变量调用扩充的SetVariable函数,以便通过执行上面参考图5描述的操作来把所述变量写入变量存储器。重复此过程直到到达块映象的末端。
依照本发明的另一方面,固件可以被配置为响应于固件更新来执行重新启动时压缩扫描,由此来添加压缩器。例如,可以使用压缩扫描来压缩先前以未压缩形式存储在固件装置中的现有变量数据。
在图7中示出了用于举例说明依照一个实施例执行的操作和逻辑的流程图,用于执行重新启动时压缩扫描。所述过程以类似于上述图3的方式开始,其中块700、702和704的操作分别类似于块300、302和304的操作。随后,在判定块706中确定是否存在任何未压缩的变量。如果回答是否定的,那么预引导初始化过程继续,最后导致在块708中启动引导目标。
如果确定未压缩变量存在,那么逻辑继续至块710,其中把变量存储块(例如,NVRAM块426)的映象拷贝到系统存储器中。然后在块712中擦除所述变量存储块。然后每个变量由在开始和结束块714和716所定义的操作处理。首先,在判定块718中确定当前处理的变量是否是未压缩的。如果变量是未压缩的,那么它在块720中被压缩并且在块722中被写入变量存储块(或者如果使用多个变量存储块的话,写入一个可用的存储块,其中在一个实施例中,写入第一块直到第一块被写满,然后写入第二块直到第二块写满等等)。如果变量已经被压缩,那么只简单地在块722中将其以压缩的形式写入到变量存储块。重复此过程直到已经处理所有变量,于是在块708中继续预引导初始化操作,来启动引导目标。
依照本发明的另一方面,与上述压缩/解压缩类似的模式可以应用于变量的加密/解密。在一个实施例中,单独使用变量的加密与解密。在另一实施例中,并行组合压缩/解压缩和加密/解密。
参考图8,除增加了在回收块448中所存储的加密DXE驱动器800、具有DXE IPL PEIM 412的解密器802和由变量服务API 444′所引入的解密协议804之外,支持固件变量数据的加密与解密的示例性固件配置包含在图4中所示出的类似组件。通常,加密DXE驱动器可以位于存储器中的任何地方,诸如无容错块,而解密器应当位于不可置换的块,诸如恢复块402。在并行组合压缩/解压缩和加密/解密的实施例中,加密DXE驱动器800和压缩器DXE驱动器446存在于回收块448,而解密器802和解压缩器418存在于恢复块402(未示出)。
实质上,加密DXE驱动器800和解密器802分别以类似于压缩器DXE驱动器446和解压缩器418的方式起作用。在这种情况下,元数据M″包含表明变量是否被加密的标记,并且把所述数据作为具有<M″i,E(Bi)>形式的2元组来存储。例如,在图9a中示出了单独使用加密/解密的读取操作。此过程在块900中开始,其中通过调用GetNextVariableName和扩充的GetVariable函数来读取变量内容。特别地是,在判定块902中GetVariable函数检查元数据M″以便确定当前所考虑的变量是否以加密形式存储。如果所述变量的加密的,那么在块904中使用所描述的解密器802来解密所述变量。如果所述变量没有加密,那么在块906中简单地读取该变量。不论那种情况,在结束块908中,把未加密的变量返回到调用者。
图9b的流程图示出了依照一个实施例的操作和逻辑,其中把压缩和解压缩操作添加到图9a的流程图。在这个例子中,采用与上述相同的方式来执行块900、902和904的操作,产生未加密的变量。接下来,在判定块910中确定所述未加密的变量是否被压缩。如果是的话,那么在块912中解压缩所述未加密的变量;否则在块914中只是简单地读取它。然后在结束块916中将所产生的未加密和未压缩的变量返回到调用者。
在加密解密模式下把变量写入固件存储器类似于上述参考图5的压缩/解压缩。在块1000中,经由对变量服务API 444′的相应调用,变量内容被作为Data参数提供给扩充的SetVariable函数。在判定块1002中,确定是否存在加密器。如果回答是肯定的,那么在块1004中经由压缩器DXE驱动器800来加密变量。无论加密器是否存在,在判定块1006中确定在变量存储器(例如,NVRAM块426)中是否留有足够空间用于存储加密或未加密的变量。如果剩余空间足够,那么取决于加密器的存在与否,所述变量被以加密或未加密的形式写入到变量存储器。然后依照返回块1010,过程成功退出,返回到调用者。如果变量存储器中的剩余空间不够,那么依照返回块1012过程退出并且向调用者返回错误标记。
图10b的流程图示出了依照一个实施例的操作和逻辑,其中把压缩和解压缩操作添加到图10a的流程图。在这个例子中,块1000、1002和1004的操作以与上述相同的方式执行,如果存在加密器的话产生加密的变量,否则产生未加密的变量。然后在判定块1014中确定所述加密/未加密的变量是否被压缩。如果是的话,那么在块1016中压缩变量并且逻辑流向判定块1006′;否则逻辑直接进行到判定块1006′。如果在存储器中留有足够的空间用于存储加密/未加密和压缩/未压缩的变量,那么在块1008′中存储该变量,并且在返回块1010′中过程成功退出,返回到调用者。然后在结束块916中将所得到的未加密和未压缩的变量返回给调用者。如果变量存储器中的剩余空间不够,那么在返回块1012′中过程退出并且向调用者返回错误标记。
在上述实施例中,变量首先被加密继而被压缩。这只是一个示例性的次序,变量也可以首先被压缩继而被加密。在一个实施例中,可以采用对称加密方案,诸如由高级加密标准(AES)机构的联邦信息处理标准(FIPS)197(http/csrc.nist.gov/publications/fips/fips97/fips-197.pdf)。
通常,采用与这里所描述的用于压缩和加密类似的方式,本发明的原理可以应用于任何类型的固件变量转换。例如,变量可以被转换为包含错误校正码(ECC)数据以便防止丢失位。在另一实施例中,为了安全目的可以使用依照数字签名模式的转换。此外,可以并行实现多个转换器,诸如函数F=C1(C2(C3))...等所示,其中C1、C2和C3是相应的转换函数。转换类比还适用于如下的故障保险渴望转换。首先,如果转换器可用,那么用它来转换变量,否则忽略转换。然后,诸如在恢复块402中,应该以故障保险方式存储解转换器(即,用于把以转换形式存储的固件变量恢复到其未转换形式的组件)。同前面一样,在一个实施例中,转换器被存储在固件装置的无容错块中,以致它可能丢失。因为解转换器被安全存储,所以它将仍可用于恢复变量数据。
还应当理解的是,所使用的特定转换模式对那些特定转换领域内(压缩,加密,ECC,数字签名等)的技术人员来说是已知的。因此,这里并没有包括特定转换过程的更多细节以免模糊本发明。
用于实施本发明实施例的示例性计算机系统参考图11,举例说明了通常常规的计算机1100,所述计算机1100适于用作计算平台来实施本发明的实施例。适合实现上述实施例的计算机的例子包括PC类系统、便携式计算机、服务器和工作站。
如本领域内普通技术人员公知的,计算机1100包括处理器机箱1102,其中安装有软盘驱动器1104、硬盘驱动器1106、母板1108和电源(未示出),所述母板1108组装有适当的集成电路,包括存储器1110、一个或多个处理器(CPU)1112、固件存储装置1113。应当理解,硬盘驱动器806可以包括单个单元或多个硬盘驱动器,并且可以选择性地位于在计算机1100外。计算机包括监视器1114,用于显示由在计算机上运行的软件程序和程序模块所产生的图形和文本。鼠标1116(或其它指示装置)可以连接到在处理器机箱1102后方的串行端口(或总线端口或USB端口),并且来自鼠标1116的信号被传送到母板,以便控制在显示器上的游标以及选择由计算机上执行的软件程序和模块显示在监视器1114上的文字、菜单选项和图形组件。另外,键盘1118与母板耦合,以供用户输入影响计算机上执行的软件运行的文本和命令。计算机1100还包括网络接口卡1120或内置网络适配器,用于把计算机连接到计算机网络,诸如局域网、广域网或因特网。
选择性地,计算机1100还可以包括光盘只读存储器(CD-ROM)驱动器1122,可以把CD-ROM盘片插入该驱动器从而可以读取盘片上的可执行文件和数据以便转送到存储器中和/或计算机1100的硬盘驱动器1106上的存储设备中。还可以包括其它大容量存储装置,诸如光学记录介质或DVD驱动器。
组成令CPU实现本发明上述功能的软件的机器指令可能分布在软盘或CD-ROM(或其它存储介质)上,并存储在硬盘驱动器中直到载入随机存取存储器(RAM)以供CPU执行。选择性地,可以经由计算机网络加载所有或部分机器指令。
存储在固件存储装置1113上的固件指令通常将存储在相应的诸如闪速装置、EEPROM之类的非易失性可重写存储装置上,所述固件指令可以由处理器1112执行以便完成上述的各个固件操作。被具体化为载波的固件也可以经由网络下载并拷贝到固件装置(例如,“闪速存储到闪速装置”),或可以最初存储在盘片介质上并被拷贝到固件装置。
从而,本发明的实施例可以被用作或支持在某种形式的处理核心(诸如计算机的CPU)上执行的固件和软件指令,或在计算机可读介质之上或之内执行或实现的固件和软件指令。计算机可读介质包括用于以机器(例如,计算机)可读形式来存储或发送信息的任何机制。例如,计算机可读介质可以包括诸如只读存储器(ROM);磁盘存储介质;光存储介质和闪速存储装置等之类的存储装置。另外,计算机可读介质可以包括传播的信号,诸如电、光、声或其它形式的传播信号(例如,载波、红外信号、数字信号等)。
以上对本发明所举例说明的实施例的描述,包括在摘要中所描述的内容,并非意在把本发明穷举或限制为所公开的形式。虽然,为了说明性目的在这里描述了本发明的具体实施例和例子,然而相关领域内的技术人员将认识到,在本发明的范围内可以进行各种等效的修改。
根据上述详细说明可以对本发明进行这些修改。用于下列权利要求的术语不应当被解释为把本发明限制为说明书和权利要求中所公开的具体实施例。相反地,本发明的范围完全由下列权利要求来确定,所述权利要求依照所建立的权利要求解释规则来理解。
权利要求
1.一种方法,包括经由固件压缩固件变量数据以便生成压缩的固件变量数据;并且把所述压缩的固件变量数据存储在固件存储装置中。
2.如权利要求1所述的方法,还包括从固件存储装置获取压缩的固件变量数据;并且解压缩所述压缩的固件变量数据。
3.如权利要求1所述的方法,其中所述压缩的固件变量数据包括原始的固件变量数据,还包括通过执行下列操作来利用新的固件变量数据来更新原始的固件变量数据,所述操作包括以压缩或未压缩形式之一来把新的固件变量数据存储在固件存储装置中;并且把原始的固件变量数据标记为删除。
4.如权利要求3所述的方法,其中把原始的和新的固件变量数据存储在固件存储装置的存储块中,还包括通过执行下列操作来合并在固件块中的变量数据,所述操作包括存储所述存储块的映象;擦除所述存储块;并且压缩在存储块的映象中没有被标记为删除的任何变量,并且把它们写回到所述存储块,而跳过被标记为删除的任何变量。
5.如权利要求1所述的方法,还包括与压缩的固件变量数据一起存储用以表明该数据是被压缩的标记。
6.如权利要求1所述的方法,其中所述压缩的固件变量数据以<M′i,C(Bi)>的2元组格式存储,其中M′i包括对应于第i个元组的元数据,Bi包括对应于第i个元组的数据,而C表示压缩函数。
7.如权利要求1所述的方法,还包括提供一个接口,以便使操作系统运行期组件能够访问所述压缩的固件变量数据。
8.如权利要求1所述的方法,还包括在固件变量数据被压缩之前或之后加密该固件变量数据,以便把所述固件变量数据转换为压缩且加密的形式。
9.一种方法,包括接收存储第一固件变量的请求;确定压缩器是否可用于压缩第一固件变量;并且如果压缩器可用于压缩第一固件变量并且把它存储在固件存储装置中,那么使用所述压缩器,否则如果压缩器不可用的话,以未压缩形式把第一固件变量存储在固件存储装置中。
10.如权利要求9所述的方法,还包括接收存储第二固件变量的请求;确定压缩器不再可用;并且以未压缩形式把第二固件变量存储在固件存储装置中。
11.如权利要求9所述的方法,其中未压缩的固件变量以<Mi,Bi>的2元组格式存储,其中Mi包括对应于第i个元组的元数据,而Bi包括对应于第i个元组的数据,而压缩的固件变量以<M′i,C(Bi)>的2元组格式存储,其中M′i包括对应于第i个元组的元数据,所述第i个元组包含用于表明第i个元组被压缩的标记,Bi包括对应于第i个元组的数据,而C表示压缩函数。
12.一种方法,包括响应于计算机系统加电或重置事件,扫描计算机系统中的固件存储装置以便查找以未压缩形式存储的未压缩的固件变量;把未压缩的固件变量转换为压缩形式。
13.如权利要求12所述的方法,其中通过执行下列操作来把未压缩的固件变量转换为压缩形式,所述操作包括复制其中存储有未压缩固件变量的固件存储块的映象;擦除所述固件存储块;压缩每个未压缩的变量;并且把已压缩的变量写回到所述固件存储块。
14.如权利要求13所述的方法,还包括对于任何压缩的固件变量,扫描所述映象;并且把所述压缩的变量写回到固件存储块。
15.一种方法,包括把第一转换器存储在固件存储装置的无容错部分中;把第一解转换器存储在固件存储装置的容错部分中;确定第一转换器是否可用;并且如果确定第一转换器可用,那么以第一转换形式存储固件变量,否则以未转换的形式存储所述固件变量。
16.如权利要求15所述的方法,还包括利用第一解压缩器来访问以第一转换形式存储的固件变量。
17.如权利要求15所述的方法,还包括把第二转换器存储在固件存储装置的无容错部分中;把第二解转换器存储在固件存储装置的容错部分中;确定第二转换器是否可用;并且如果确定第一和第二转换器都可用,那么经由第一和第二转换器所执行的第一和第二转换操作以组合的转换形式来存储固件变量,或者如果确定第一转换器可用而第二转换器不可用,那么经由第一转换器所执行的转换操作以第一转换形式来存储固件变量,否则如果确定第二转换器可用而第一转换器不可用,那么经由第二转换器所执行的转换操作以第二转换形式来存储固件变量。
18.一种制造产品,包括其上存储有指令的计算机可读介质,所述指令在执行时通过执行下列操作使存储固件变量数据便于进行,所述操作包括接收存储固件变量数据的请求;压缩固件变量数据以便生成压缩的固件变量数据;并且把所述压缩的固件变量数据存储在固件存储装置中。
19.如权利要求18所述的制造产品,其中执行所述指令还进行以下操作从固件存储装置获取压缩的固件变量数据;并且解压缩所述压缩的固件变量数据。
20.如权利要求19所述的制造产品,其中所述指令包括固件。
21.如权利要求20所述的制造产品,其中所述产品包括闪速存储器。
22.一种制造产品,包括其上存储有指令的计算机可读介质,所述指令在执行时通过执行下列操作使存储固件变量便于进行,所述操作包括接收存储第一固件变量的请求;确定压缩器是否可用于压缩第一固件变量;并且如果压缩器可用于压缩第一固件变量并且把它存储在固件存储装置中,那么使用所述压缩器,否则如果压缩器不可用的话,以未压缩形式把第一固件变量存储在固件存储装置中。
23.如权利要求22所述的制造产品,其中所述产品包括闪速存储器。
24.如权利要求23所述的制造产品,其中所述指令的一部分包括用于压缩固件变量的压缩器,并且闪速存储器包括其中存储有压缩器的无容错存储块。
25.如权利要求24所述的制造产品,其中执行所述指令还进行以下操作接收存储第二固件变量的请求;确定压缩器不再可用;并且以未压缩形式把第二固件变量存储在固件存储装置中。
26.如权利要求23所述的制造产品,其中所述指令的一部分包括用于对压缩的固件变量进行解压缩的解压缩器,并且闪速存储器包括其中存储有解压缩器的容错存储块。
27.一种计算机系统,包括母板;处理器,与母板耦合;易失性存储器,与母板耦合;和引导固件装置,与母板耦合并且包括闪速存储器,所述闪速存储器在其中存储有包括压缩器的固件组件,所述固件组件包括当由处理器执行时通过执行以下操作实现固件变量存储的指令,所述操作包括发布接口;经由所述接口接收存储固件变量的请求;确定压缩器是否可用于压缩所述固件变量;并且如果压缩器可用于压缩第一固件变量并且把它存储在引导固件装置中,那么使用所述压缩器,否则如果压缩器不可用,那么以未压缩形式把固件变量存储在引导固件装置中。
28.如权利要求27所述的计算机系统,其中所述指令的一部分包括用于对压缩的固件变量进行解压缩的解缩压器。
29.如权利要求28所述的计算机系统,其中压缩器被存储在引导固件装置的无容错块中,而解缩压器被存储在引导固件装置的不可更新块中。
30.如权利要求27所述的计算机系统,其中执行所述指令还进行以下操作接收来自请求者读取在引导固件装置中所存储的固件变量的请求;确定所述固件变量是以压缩形式还是以未压缩形式存储;并且如果所述固件变量以压缩形式存储,那么解压缩所述固件变量以便生成未压缩的固件变量,并且向请求者提供该未压缩的固件变量,否则如果所述固件变量以未压缩形式存储,那么向请求者提供所述固件变量。
全文摘要
用于把转换的固件变量存储在诸如闪速存储器的固件存储装置中的基于固件的转换方法。在一个方法下,执行对固件的“渴望”压缩。响应于存储请求,确定压缩器是否可用。如果可用的话,那么以压缩形式把固件变量存储在存储装置中;如果不可用的话,那么以未压缩形式存储固件变量。响应于对所存储固件变量的读取请求,确定所述变量是以压缩形式还是以未压缩形式存储。如果是压缩形式,那么在把它提供给请求者之前,使用解压缩器把所述变量返回到未压缩形式;把已经是未压缩形式的变量直接提供给所述请求者。提供了应用程序接口以便使操作系统能在运行期访问所述固件变量。可以独立地或并行地使用类似的转换,包括加密。
文档编号H03M7/30GK1809813SQ200480016970
公开日2006年7月26日 申请日期2004年5月26日 优先权日2003年6月16日
发明者V·齐默, M·罗思曼, G·米勒, M·多兰 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1