APP下载

基于UEFI的SMBIOS设计与研究

2013-09-10朱贺新王正鹏

计算机工程与设计 2013年9期
关键词:表项字符串固件

朱贺新,王正鹏

(1.北京工业职业技术学院 信息工程系,北京100042;2.瞬联软件科技 (北京)有限公司,北京100102)

0 引 言

系统管理基本输入输出系统 (system management basic input output system,SMBIOS)负责收集系统信息,提供给操作系统,用于操作系统安装与管理。由于计算机涉及的软硬件种类繁多,每种设备的品牌、型号、版本各不相同,各种配置的组合致使机型数目巨大,操作系统无法根据各种机型逐一定制,因此需要SMBIOS的支持。从计算机分层设计角度出发,操作系统不会直接扫描全部计算机固件和硬件,他需要基本输入输出系统 (basic input output system,BIOS)的支持,BIOS负责初始化硬件设备,收集计算机系统信息和引导操作系统。BIOS中的系统软硬件基本信息将以SMBIOS的形式组织,并提供给操作系统访问。SMBIOS是BIOS的核心组成部分之一,是计算机系统不可或缺的部分。目前有关SMBIOS的研究多集中在SMBIOS所提供信息的应用,如通过读取SMBIOS表用于生成随机数并加密[1],读取特定表项并分析以读取系统固件[2],使用表项进行杂凑并数字签名[3],传输整个SMBIOS表[4]。有关架构设计及实现方法的资料比较缺乏,工程师在开发SMBIOS过程很难获得指导其开发的相关资料,而SMBIOS的开发与客户化定制是目前工程应用中研发热点与难点之一,本文源自实际工程应用,针对研发过程,系统介绍SMBIOS架构和参考实现,从而为SMBIOS研发工程师及相关领域的研究提供指导。

1 技术综述

1.1 UEFI

BIOS介于硬件和操作系统之间,负责系统加电自检,硬件设备初始化,执行驱动和某些应用程序,收集系统信息,屏蔽硬件差异,引导操作系统并提供系统调用。统一可扩 展 固 件 接 口 (unified extensible firmware interface,UEFI)是替代传统BIOS的升级方案[5]。UEFI规范定义了固件于固件之间,固件与操作系统之间的接口与服务,相比传统BIOS,UEFI采用全新的架构与模块化设计[6]的理念;具有丰富的可扩展性,良好的兼容性,绝大多数采用C语言开发,易于开发与维护,UEFI规范中已定义SMBIOS_TABLE_GUID用来定位SMBIOS表因而本文在UEFI的基础上设计SMBIOS。

1.2 SMBIOS

系统管理BIOS (system management BIOS,SMBIOS)规范定义了用户或者应用程序存储和访问计算机系统信息的一系列数据结构 (即信息存放格式)以及访问方法[7](例如如何在系统中获得SMBIOS所描述的计算机系统信息),是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。根据SMBIOS规范,系统管理者可以获取系统各部件的型号,参数设置,所处状态等一系列信息,通常SMBIOS实现至少包含BIOS,整机,主板,内存,CPU,端口和集成设备的详细信息。

SMBIOS的数据存储结构由两部分构成:入口结构(Entry Point Structure,EPS)表和SMBIOS数据表,EPS表对SMBIOS版本,SMBIOS数据表在内存中存储位置,长度等信息进行说明。SMBIOS数据表对计算机系统各组件的数据存储及结构进行详细说明。SMBIOS EPS表部分结构见表1。

表1 EPS结构

通过EPS表结构中的16H以及18H处,获得数据表长度和数据表地址,即可访问结构表。从EPS表中的1CH处可得知SMBIOS数据表表项的总数。

2 架构设计

为实现对SMBIOS规范的支持,基于固件和软件相关规范设计了SMBIOS系统架构,如图1所示。

图1 SMBIOS系统架构

SMBIOS核心服务部分主要需要完成两方面功能,首先将负责创建EPS并将其注册到固件系统;其次需要提供SMBIOS表项的操作接口,操作接口需要完成如下方面功能:添加SMBIOS数据表项;更新表项中字符串信息;删除数据表项;查找获取某数据表项。

SMBIOS数据表定制部分需要动态收集或静态填充相关规范所定义的数据表项信息,并调用SMBIOS核心服务部分提供的操作接口将组织好的SMBIOS表项添加到SMBIOS表中。该部分负责SMBIOS表项安装功能,提供针对特定环境或系统客户定制话开发,该部分至少需要包括如下信息:BIOS厂商信息,版本信息,编译时间;BIOS制造商名称,产品名称,产品序列号;主板制造商信息,序列号;SMBIOS结束表。

操作系统及应用部分将根据UEFI提供的接口和传递的数据,访问SMBIOS数据表内容。

3 核心实现

UEFI系统维护着一张系统表 (system table),每个UEFI驱动程序或应用程序的程序入口参数都包含该表信息,它包含了UEFI系统的服务与信息,主要的服务包括引导时服务 (boot service)和运行时服务 (runtime service),通过这两种服务可以获取UEFI多数资源。System table同时也包括各种固件版本信息、错误信息等,系统配置信息表 (EFI configuration table)也包含在系统表中,常用的工业规范都将在本表中描述。如高级电源管理接口[8]、SMBIOS。各系统配置表的表项采用全局唯一标识符(globally unique identifier,GUID)与各表项内容对应,通过该唯一的GUID可以访问到各表信息。

UEFI规范仅对其进行功能与接口定义,无相关实现方案。相关参考代码仅对System table给出了框架实现,系统配置信息表中并没有具体的信息表或工业规范表,我们所需要的SMBIOS表也没有创建。此时我们需要将SMBIOS表实现,并且注册到系统配置信息表中,并且以gE-fiSmbiosTableGuid为识别标识。下面具体介绍如何在UEFI中实现SMBIOS表。

3.1 核心服务实现

UEFI核心代码 (foundation code)已搭建UEFI框架,已经实现EFI系统表的主体部分,且创建了运行UEFI所需的基础协议 (PROTOCOL)。此时的UEFI系统基本可以运行,但对于各工业规范尚未全部支持,客户定制化功能缺乏。

SMBIOS的数据存储结构由EPS表和SMBIOS数据表构成,其中EPS部分通过gEfiSmbiosTalbeGuid可以直接定位。SMBIOS数据表可以通过ESP中的指针寻址并定位。SMBIOS在内存中以特定的字符标识,而这些特定字符定义在EPS表中,按照SMBIOS规范定义EPS数据结构如图2所示。其中 AnchorString的值为 “_SM _”,IntermediateAnchorString的值为 “_DMI_”,在查询SMBIOS表时,我们可以在区域内存中搜索这两个标识来定位SMBIOS表。

图2 EPS数据结构

在SMBIOS规范实现时需要将上述结构体中定义的各项均填充完整,由于命名显而易见各域所代表的内容,此处不赘述,仅着重说明一个域---TableAddress,该地址标识实际的表项 (即SMBIOS Table Type)在内存中的物理地址。只要找到这个地址,即可根据SMBIOS规范所定义的各个表项的数据结构解析。

根据箱梁的几何尺寸,建立ANSYS实体计算模型。双面组合连续箱梁有限元模型如图2所示,横截面如图3所示。本文采用三维六面体映射网格划分的方法,截面网格划分基本与二维模型相同,纵向单元长度约为0.3 m。模型单元总数为38 812个,节点数为66 823个。

为实现上述架构所设计的SMBIOS核心服务,需要使用一个UEFI的驱动程序,采用Protocol的形式,提供一组SMBIOS核心服务,gEfiSmbiosProtocolGuid作为该服务的唯一标识,定义如下:

UEFI系统中任意阶段和位置只要该SMBIOS Protocol已通过InstallProtocolInterface安装到UEFI系统中,即可通过gEfiSmbiosProtocolGuid获取到SMBIOS相关的服务。针对核心服务功能需求定义增加数据表项,更新字符串,移除表项,获取表项接口。

SmbiosAdd函数能将Record的内容添加到已有的SMBIOS Record之后,并返回新添加到Record的句柄SmbiosHandle,该句柄是作为此Record的身份识别标志,在后续移除某项纪录或添加字符串,都需要使用该句柄。该函数将实现SMBIOS各表项 (Item)或者不同类型的表(Type)的添加,实现表项的增加,原型定义如下:

SmbiosUpdateString函数根据将使用This指针将待写入的字符串信息 (String),根据已有Record纪录所对应句柄 (SmbiosHandle),写入到对应的位置 (StringNumber参数所指示位置)。该函数将实现SMBIOS各表项 (Item)或表 (Type)中字符串的添加功能,原型定义如下:

SmbiosRemove()和SmbiosGetNext()原型定义与SmbiosAdd(),SmbiosUpdateString()类似,原型在此不额外赘述,仅对参数及功能进行说明:SmbiosRemove函数根据将使用This将句柄SmbiosHandle所指示的的SMBIOS表项从SMBIOS整体表结构中移除。SmbiosGet-Next将使用This通过给定的参数,查找SmbiosHandle的下一个表项,并返回该表项所对应的句柄。如果Smbios-Handle输入值为0,则表示返回第一个SMBIOS Record所对应的句柄。返回句柄为0时,表示此时SMBIOS不存在SMBIOS Record,简而言之,此刻无SMBIOS表项。

当上述核心服务函数各自功能完成之后,需要将上述服务安装到UEFI系统之中,且于预先定义的gEfiSmbiosProtocolGuid相关联,可以通过UEFI提供的系统服务InstallProtocolInterface实现SMBIOS核心服务函数与gE-fiSmbiosProtocolGuid关联并安装到UEFI系统之中。具体实现如图3所示。

3.2 数据表定制

图3 核心服务安装

本部分最重要的工作是通过gEfiSmbiosProtocolGuid定位到一个可以使用的实例 (instance),并通过该实例调用SMBIOS核心服务,通过SmbiosAdd()和SmbiosUpdateString()核心服务添加表项和字符串。为便于客户化定制,我们设计一个单独的驱动程序来完成该任务。该驱动的入口点为SmBiosTableDxeInitialize。如图4所示。

图4 数据表定制

第一个方框表示程序的入口地址及入口参数,系统表指针即通过第二个参数传入,当需要使用系统服务的时候可以通过SystemTable参数获取,如需要使用运行时服务可以通过gBS=SystemTable->BootServices的方法获得。第二个方框完成的主要工作是通过gEfiSmbiosProtocolGuid定位到一个可以使用的Smbios实例,后续的表项添加删除及定位操作都需要使用Smbios实例;第三个方框所封装的行数将通过调用SmbiosAdd(),SmbiosUpdateString()等将收集到的系统硬件固件各状态、版本等信息填充到各个表项并安装至UEFI系统配置表。

各表项安装原理相似,都是先将该表项的表头添加通过SmbiosAdd()核心服务添加到现有的SMBIOS表中,然后通过SmbiosUpdateString()更新具体的字符串,下面已SMBIOS规范规定的某一个表项 (类型3)进行简单说明。如图5所示。

图5 数据表项

UpdateSysEnclosureInfoTable函数将创建一个表项(type 3),它将在创建SMBIOS Table表项时被调用,见图4最后一行代码显示调用。本函数使用SmbiosAdd()核心服务通过Smbios->Add的形式将smbiosSysEnclosureInfo实例添加到表项,并返回SysEnclosureHandle句柄以供后续更新字符串或删除表项使用;同时使用更新字符串核心服务将Test Manufacturer[My Paper Co.,Ltd.]和 Test String Version Number 1.0.0For My Paper更新到SysEnclosureHandle所对应的表项。

4 验 证

对于本文所的设计方案,已进行相关的代码测试及实际运行环境验证,相关的测试与验证结果如下:

UEFI提供了一套类似于Linux shell的环境,可用来代码验证和测试:我们在UEFI shell[9]环境下读取出整个SMBIOS Table的内容,其中有关 UpdateSysEnclosureInfoTable()部分所写入的字符串信息截图如图6所示。

图6 UEFI Shell验证结果

图6右侧方框即为UpdateSysEnclosureInfoTable()函数所写入的字符串信息的Ascii码显示,而其左侧则为对应的二进制显示信息,通过SMBIOS Table解析程序解析完该 表 后 可见该表 类 型 为 System Enclosure (Type 3),Manufacturer为 Test Manufacturer[My Paper Co.,Ltd.],版本 信 息 为:Test String Version Number 1.0.0For My Paper,至于其他信息暂时没有填充全面,但作为真实的对外销售产品,其余各项已被补全。

使用 Win32 系统函数 GetSystemFirmwareTable[10-11]也可以去读SMBIOS信息。如图7所示,在windows控制台(cmd.exe)下运行读取SMBIOS的可执行文件,打印出整个SMBIOS表。本程序仅显示出整个SMBIOS表,并未逐项解析各表。(由于涉及所使用的真实硬件平台某项私密信息,故将某些部分模糊化处理)为了便于阅读与理解,此处都是以Ascii形式输出,由于每个表项皆有各自表头,表头信息打印出来的不一定是可读的Ascii码,故比较凌乱。

图7 Win32API验证结果

Windows下微软也提供了相应的 组件读取SMBIOS Table的内容,我们可以使用 WMI[12](Windows Management Instrumentation)读取SMBIOS信息;图8是基于WMI的Win 32控制台程序的运行结果。该程序对各类型的SMBIOS表项进行了解析,划线部分内容为Update-SysEnclosureInfoTable()函数所写入字符串信息。

图8 WMI验证结果

综上各环境下的运行结果可见此设计方案具有可行性,在UEFI shell和Windows下均可被各自系统识别且运行结果与期望结果一直。

5 结束语

本设计适用于基于UEFI的SMBIOS相关的研究与开发。由于采用分层设计且符合UEFI规范,较传统BIOS实现本设计可通过GUID定位SMBIOS并读取其内容;模块化设计易于开发、集成与测试,核心服务与SMBIOS数据表分离的设计,Protocol形式提供核心服务,简单易用;SMBIOS数据表采用单独驱动实现,方便扩充数据表内容及客户化定制。本文已进行代码实现且在真实平台上正确运行,对设计方案进行全面的验证,确保设计可行性与可实现性。由于BIOS异常将导致计算机无法启动,后续需要提升程序容错能力,错误恢复与旁路 (by pass)以增强程序健壮性。

[1]LI Mogang.The software protection research based on SMBIOS[D].Lanzhou:Lanzhou University,2008:14-25 (in Chinese).[李模刚.基于SMBIOS的软件保护研究 [D].兰州:兰州大学,2008:14-25.]

[2]WANG Xiaozhen,ZHOU Zhenliu,LIU Baoxu.Design and implementation of BIOS sampling and analyzing system [J].Computer Engineering,2011,37 (11):2-3 (in Chinese).[王晓箴,周振柳,刘宝旭.BIOS采样分析系统的设计与实现[J].计算机工程,2011,37 (11):2-3.]

[3]Currid Andrew,Overby Mark A.System and method to accelerate identification of hardware platform classes [P].United States:US2008043000,2008-02-21.

[4]Shah Hemal V,Hurd Stephen,Swindell Robert R.Method and system for a platform level data model and messages for transferring SMBIOS structures and data [P].United States:US2009019278,2009-01-15.

[5]ZHANG Ying,ZHOU Changsheng.Analysis and development of USB device driver on UEFI [D].Dalian:Publishing House of Electronics Industry,2009:217-220 (in Chinese). [张颖,周长胜.基于可扩展固件接口的USB设备驱动的开发与研究[D].大连:电子工业出版社,2009:217-220.]

[6]UEFI Inc.Unified extensible firmware interface specification version2.3 [EB/OL]. [2012-11-13].http://sourceforge.net/,2009/.

[7]DMFT Inc.System management BIOS (SMBIOS)reference specification version 2.7.1 [EB/OL].[2012-11-13].http://www.dmtf.org/,2011-01-26/.

[8]Hewlett Packard Corp,Intel Corp,Microsoft Corp,et al.ACPI specification [EB/OL]. [2012-11-13].http://www.acpi.info/spec.htm,2011/.

[9]U EFI Inc.Shell command reference manual revision 2.0 [EB/OL].[2012-11-13].http://sourceforge.net/,2008/.

[10]Microsoft Corp.Get system firmware table function(Windows)[EB/OL]. [2012-11-13].http://msdn.microsoft.com/en-us/library/windows/desktop/ms724379 (v=vs.85).aspx,2012-10-16/.

[11]Microsoft Corp.SMBIOS support in Windows [EB/OL].[2012-11-13]. http://msdn.microsoft.com/en-us/library/windows/hardware/gg463136.aspx,2005-04-25/.

[12]XIE Wei.Design and implementation of multichannel data collecting system [D].Shenyang:Shenyang Ligong University,2010:44-52 (in Chinese).[解威.多通道数据采集系统的设计与实现 [D].沈阳:沈阳理工大学,2010:44-52.]

猜你喜欢

表项字符串固件
一种改进的TCAM路由表项管理算法及实现
基于Holt 双参数指数平滑法的SDN 交换机流表超时优化策略*
基于文本挖掘的语词典研究
SDN数据中心网络基于流表项转换的流表调度优化
基于SHA1的SCADA系统PLC固件完整性验证方法
SQL server 2008中的常见的字符串处理函数
基于固件的远程身份认证
最简单的排序算法(续)
英特尔发布免费固件引擎
提取ROM固件中的APP