符合SMBIOS规范的通用采集接口的实现
2010-07-27吴瑞睿
吴瑞睿 解 威
(沈阳理工大学,辽宁 沈阳 110159)
1 引言
目前,实现计算机系统采集的方法有很多,相关标准包括:IETF 的 SNMP、DMTF(Distributed Management Task Force)的桌面管理接口 DMI(Desktop Management Interface)、基于Web的企业管理WBEM (Web-Based Enterprise Management)、SMBIOS (System Management BIOS)等。
其中,SMBIOS是主板或系统制造商以标准格式登记产品管理信息所需遵循的统一规范。DMI是帮助收集电脑系统信息的管理系统,DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行。
SMBIOS和DMI是由行业指导机构DMTF起草的开放性的技术标准,其中,DMI设计适用于任何的平台和操作系统。DMI充当了管理工具和系统层之间接口的角色。通过DMI,用户可以获取序列号、硬件厂商、串口信息以及其它系统配件信息。DMI通常将上述信息存储在BIOS中一个4KB大小的DMI数据区中,这一数据区通常被称为MIFD(Management Information Format Database)。它允许操作人员在该数据区中手工添加一些BIOS不能探测到的诸如使用者姓名、销售商和计算机编号等额外的控制信息,因此也可以在不需要对BIOS进行操作的情况下,使用DMI对MIFD数据库中的系统配置情况进行修改以适应不同环境下的系统要求。
2 SMBIOS版本的识别
对于符合SMBIOS规范的计算机,可以通过访问SMBIOS的结构获得系统信息,访问方法共有两种:
2.1 通过即插即用功能接口访问SMBIOS结构,这个在SMBIOS 2.0标准里定义了,从SMBIOS 2.1开始这个访问方法不再被推荐使用。
2.2 基于表结构的方法,表内容是Entry PointStructure(EPS)中的数据,这个访问方 法 从 SMBIOS 2.1以后开始被使用,从2.1开始,以后的版本都推荐使用这种访问方式。在SMBIOS 2.1版本中允许支持这两种方法中的任意一种或者两种,但在SMBIOS 2.2以后的版本,必须支持第二种方法[1]。
SMBIOS有多个版本,目前最高的版本为2.5,于2006年9月5日发布,对于实验机所使用的DMI版本,可使用Windows自带的DEBUG程序来进行判断。
(1)在 MSDOS窗口下,键入 DEBUG,回车。
(2)-s f000:0 ffff'_SM_'(SM 必须大写),回车。
F000:A430
注:如果显示了一个地址,显示的地址可与本实例不同,则BIOS实现的是SMBIOS 2.1以上的版本。
如果在以上的地址范围内没有找到给定的字符串,可以再尝试以下的方法:
(1)在 MSDOS窗口下,键入 DEBUG,回车。
(2)-s f000:0 ffff'_DMI_'(DMI必须大写),回车。
F000:A440
?
注:如果显示了一个地址,显示的地址可与本实例不同,则BIOS仅实现的是SMBIOS 2.0的版本.如果没有回显的地址,则说明对SMBIOS 2.0以上的版本都不支持。
如果进一步确认BIOS是实现的SMBIOS 2.1或是SMBIOS 2.2,须进行以下的操作:
(1)在 MSDOS窗口下,键入 DEBUG,回车。
(2)-d f000:a430,回车。
3 SMBIOS通用接口的设计
WMI(Windows管理规范:Windows Management Instrumentation)是 Microsoft基 于Web的企业管理(WBEM)的实现,同时也是一种基于标准的系统管理接口[2]。WMI最早出现在Microsoft Windows 2000系统上,但它同样可以安装在Windows NT4.0和Windows 9x计算机上 [3]。WMI以CIMOM为基础,CIMOM即公共信息模型对象管理器(Common Information Model Object Manager),是一个描述操作系统构成单元的对象数据库,为MMC和脚本程序提供了一个访问操作系统构成单元的公共接口。有了WMI,工具软件和脚本程序访问操作系统的不同部分时不需要使用不同的API;相反,操作系统的不同部分都可以插入WMI,工具软件和脚本也可以方便地读写 WMI[4]。
其中,SMBIOS提供层:利用WMI实现的COM接口,查找EPS表,确定SMBIOS的版本、SMBIOS的结构表的起始地址以及SMBIOS结构表的长度。然后,实现对底层物理内存空间中的SMBIOS数据进行采集。
SMBIOS遍历层:利用SMBIOS提供层提供的数据,针对给出的TYPE值,进行相应类型值的采集。确定类型的起始位置,以及结束位置。保存此类型的结构表信息,提供给SMBIOS解析层。
SMBIOS解析层:调用相应的类型处理函数来处理相应的类型数据,按照SMBIOS规范解析出表信息,传递给SMBIOS格式化显示层。
SMBIOS格式化显示层:将SMBIOS解析层提供的字符串,按照统一的格式显示出来。
4 采集SMBIOS编程实现
本文所有程序都是在VC++6.0平台上测试通过。遵循的是SMBIOS2.5版本规范。具体实现流程如下所示:
(1)所需的头文件和静态库[5]
(2)初始化COM接口
使用WMI,必须先初始化COM接口,在程序的一开始调用 CoInitialize(NULL);或者调用CoInitializeEx(0,COINIT_MULTITHREA DED)
(3)初始化IwbemLocator接口IWbemLocator*pLoc=0;
(4)初始化IwbemServices接口。连接rootcimv2命名空间,获得指向IwbemServices接口的指针。
(5)设置IwbemServices代理权限
?
(6)枚举WBEM类对象指向SMBIOS表结构
(7)获得SMBIOS的主版本号和次版本号。
(8)获得SMBIOS结构表的起始地址。
下面以 TYPE 0(BIOS information)为例说明格式域和文本域的关系。
每个TYPE结构都分为格式域和文本域,文本域与格式域相关,直接位于格式域的后面,文本域中每个字符串的结束,都要以一个空字符(00h)作为结尾,整个字符串集合的结束,还要额外加上一个空字符。
采集SMBIOS TYPE 0数据如下:
根据上表给出的信息,可以知道类型是0h,格式域的长度为 24(18h),句柄为 0000h,偏移04h的是厂商信息,可以读出的值是01h,这说明在文本域中的第一个字符串对应的是BIOS生产厂商信息。可以依照此法将TYPE 0的信息解析出来。结论如下:
BIOS生产厂商:American Megatrends Inc.
BIOS版本号:080014
BIOS发布日期:01/29/2008
5 结论
因为SMBIOS是由计算机的硬件厂商来实现,它较其它方法更能精确的采集硬件相关的数据。本文重点的介绍了符合SMBIOS规范的通用接口的设计和实现。旨在为桌面管理系统的数据采集提供一个全新的思路。
[1]DMTF.System Management BIOS(SMB IOS)Reference Specitication Version 2.5[S].2006
[2]Mary Jander.WBEM scheme final.Data Communications[J],1999,28(15):12
[3]姜劲松,吴礼发.基于WMI的系统管理的设计与实现[J].计算机应用,2004,24(3):16~18.
[4]李玉龙,孙丽丽.基于CIM的系统管理实现技术[J].兰州交通大学学报,2004,23(6):85~86
[5]David S.Platt.深入理解COM+[M].潘爱民译.北京:清华大学出版社,2002.