SMBIOS信息概述 -- DMI
先介绍 DMI 。 DMI 是英文单词 Desktop Management Interface 的缩写,也就是桌面管理界面,它含有关于系统硬件的配置信息。计算机每次启动时都对 DMI 数据进行校验,如果该数据出错或硬件有所变动,就会对机器进行检测,并把测试的数据写入 BIOS 芯片保存。所以如果我们在 BIOS 设置中禁止了 BIOS 芯片的刷新功能或者在主板使用跳线禁止了 BIOS 芯片的刷新功能,那这台机器的 DMI 数据将不能被更新。如果你更换了硬件配置,那么在进行 WINDOWS 系统时,机器仍旧按老系统的配置进行工作。这样就不能充分发挥新添加硬件的性能,有时还会出现这样或那样的故障。
SMBIOS(System Management BIOS , SMBIOS) 是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。 DMI(Desktop Management Interface, DMI) 就是帮助收集电脑系统信息的管理系统, DMI 信息的收集必须在严格遵照 SMBIOS 规范的前提下进行。 SMBIOS 和 DMI 是由行业指导机构 Desktop Management Task Force (DMTF) 起草的开放性的技术标准,其中, DMI 设计适用于任何的平台和操作系统。 DMI 充当了管理工具和系统层之间接口的角色。它建立了标准的可管理系统更加方便了电脑厂商和用户对系统的了解。
DMI 的主要组成部分是 Management Information Format (MIF) 数据库。这个数据库包括了所有有关电脑系统和配件的信息。通过 DMI ,用户可以获取序列号、电脑厂商、串口信息以及其它系统配件信息。
对于符合 SMBIOS 规范的计算机,可以通过访问 SMBIOS 的结构获得系统信息,共有两种办法可以访问:
1. 通过即插即用功能接口访问 SMBIOS 结构,这个在 SMBIOS2.0 标准里定义了,从 SMBIOS 2.1 开始这个访问方法不再被推荐使用。
2 .基于表结构的方法,表内容是 table entry point 的数据,这个访问方法从 SMBIOS 2.1 以后开始被使用,从 2.1 开始,以后的版本都推荐使用这种访问方式。在 2.1 版本中允许支持这两种方法中的任意一种和两种都支持,但在 2.2 以后的版本,必须支持方法 2 。在最新的 2.7.0 版中第一种方法已经废弃。
鉴于市场上计算机已经均支持 SMBIOS2.3 标准,所以只考虑方法 2 ,基于表结构的访问方式。基于表结构访问 SMBIOS 的过程是先找到 Entry Point Structure ( EPS )表,然后通过 Entry Point Structure ( EPS )表的数据找到 SMBIOS 结构表。
对于非 EFI 的系统,访问 SMBIOS EPS 表的操作过程如下:
1 .从物理内存 0x000F0000-0x000FFFFF 之间寻找关键字 “ _SM_” 。
2 .找到后再向后 16 个字节,看后面 5 个 BYTE 是否是关键字 “_DMI_” ,如果是, EPS 表即找到。
对于 UEFI (是 BIOS 的下一代版本)系统,可能通过搜索 EFI 配置表中的 SMBIOS GUID(SMBIOS_TABLE_GUID) ,然后使用指向 SMBIOS 的指针来定位 EPS 表。具体可参考 UEFI 规范。
SMBIOS EPS 表结构如下:
位置 |
名称 |
长度 |
描述 |
00H |
关键字 |
4BYTE |
固定是”_SM_” |
04H |
校验和 |
1BYTE |
用于校验数据 |
05H |
表结构长度 |
1BYTE |
Entry Point Structure 表的长度 |
06H |
Major 版本号 |
1BYTE |
用于判断SMBIOS 版本 |
07H |
Minor 版本号 |
1BYTE |
用于判断SMBIOS 版本 |
08H |
表结构大小 |
2BYTE |
用于即插即用接口方法获得数据表结构长度 |
0AH |
EPS 修正 |
1BYTE |
|
0B-0FH |
格式区域 |
5BYTE |
存放解释EPS 修正的信息 |
10H |
关键字 |
5BYTE |
固定为“_DMI_” |
15H |
校验和 |
1BYTE |
Intermediate Entry Point Structure (IEPS)的校验和 |
16H |
结构表长度 |
2BYTE |
SMBIOS 结构表的长度 |
18H |
结构表地址 |
4BYTE |
SMBIOS 结构表的真实内存位置 |
1CH |
结构表个数 |
2BYTE |
SMBIOS 结构表数目 |
1EH |
Smbios BCD 修正 |
1BYTE |
通过 EPS 表结构中 16H 以及 18H 处,得出数据表长度和数据表地址,即可通过地址访问 SMBIOS 数据结构表。从 EPS 表中的 1CH 处可得知数据表结构的总数,其中 TYPE 0 结构就是 BIOS information , TYPE 1 结构就是 SYSTEM Information 。
每个结构的头部是相同的,格式如下:
位置 |
名称 |
长度 |
描述 |
00H |
TYPE 号 |
1BYTE |
结构的TYPE 号 |
01H |
长度 |
1BYTE |
本结构的长度,就此TYPE 号的结构而言 |
02H |
句柄 |
2BYTE |
用于获得本SMBIOS 结构,其值不定 |
每个结构都分为格式区域和字符串区域,格式区域就是一些本结构的信息,字符串区域是紧随在格式区域后的一个区域。结构 01H 处标识的结构长度仅是格式区域的长度,字符串区域的长度是不固定的。有的结构有字符串区域,有的则没有。
下面以 TYPE 0 ( BIOS information )为例说明格式区域和字符串区域的关系。 TYPE 0 ( BIOS information )格式区域如下:
位置 |
名称 |
长度 |
描述 |
00H |
TYPE 号 |
1BYTE |
结构的TYPE 号,此处是0 |
01H |
长度 |
1BYTE |
TYPE 0 格式区域的长度,一般为14H ,也有13H |
02H |
句柄 |
2BYTE |
本结构的句柄,一般为0000H |
04H |
Bios 厂商信息 |
1BYTE |
此处是bios 卖方的信息,可能是OEM 厂商名,一般为01H ,代表紧随格式区域后的字符串区域的第一个字符串 |
05H |
BIOS 版本 |
1BYTE |
BIOS 版本号,一般为02H ,代表字符串区域的第二个字符串 |
06H |
Bios 开始地址段 |
2BYTE |
用于计算常驻BIOS 镜像大小的计算,方法为 (10000H-BIOS 开始地址段)×16 |
08H |
BIOS 发布日期 |
1BYTE |
一般为03H ,表示字符区第三个字符串 |
09H |
BIOS rom size |
1BYTE |
计算方法为(n +1 )×64K ,n 为此处读出数值 |
0AH |
BIOS 特征 |
8BYTE |
Bios 的功能支持特征,如PCI,PCMCIA,FLASH 等 |
12H |
Bios 特征扩展 |
不定 |
紧随 TYPE 0 ( BIOS information )结构区域之后,即在 Bios 特征扩展域后面的就是 TYPE 0 ( BIOS information )字符串区域,一个例子如下所示:
- db ‘System BIOS Vendor Name’,0 ; 字符串以零结尾,第一个字符串:BIOS厂商
- db ‘4.04’,0 ; 第二个:BIOS版本
- db ‘00/00/0000’,0 ; 第三个:BIOS发布日期
- db 0 ; 以0为整个字符中区域的结尾
每个字符串都以 00H 作为结束标志,上面的例子中有三个字符串。如果我们要找下一个 TYPE ,因为最后一个字符串以 00H 结尾,而整个字符区域又以 00H 结尾,故只要在字符串区域找到连续的 0000H 即可。例如,一个带字符串域的完整 BIOS Information 例子如下:
- BIOS_Info LABEL BYTE
- db 0 ; Indicates BIOS Structure Type
- db 13h ; Length of information in bytes
- dw ? ; Reserved for handle
- db 01h ; String 1 is the Vendor Name
- db 02h ; String 2 is the BIOS version
- dw 0E800h ; BIOS Starting Address
- db 03h ; String 3 is the BIOS Build Date
- db 1 ; Size of BIOS ROM is 128K (64K * (1 + 1))
- dq BIOS_Char ; BIOS Characteristics
- db 0 ; BIOS Characteristics Extension Byte 1
- db ‘System BIOS Vendor Name’,0 ;
- db ‘4.04’,0 ;
- db ‘00/00/0000’,0 ;
- db 0 ; End of strings
一个不带字符串域的完整 BIOS Information 例子:
- BIOS_Info LABEL BYTE
- db 0 ; Indicates BIOS Structure Type
- db 13h ; Length of information in bytes
- dw ? ; Reserved for handle
- db 00h ; No Vendor Name provided
- db 00h ; No BIOS version provided
- dw 0E800h ; BIOS Starting Address
- db 00h ; No BIOS Build Date provided
- db 1 ; Size of BIOS ROM is 128K (64K * (1 + 1))
- dq BIOS_Char ; BIOS Characteristics
- db 0 ; BIOS Characteristics Extension Byte 1
- dw 0000h ; Structure terminator
注意,当从 EPS 表中得到结构表的开始地址后,可以直接按结构来寻找相应的 TYPE 号,找到后直接读取就是该 TYPE 对应的结构的格式区域信息,然后向后移动结构区域长度(结构区域长度由该结构的 01H 处读出)个 BYTE ,即是该 TYPE 结构的字符串区域。
由上面介绍可知,获得 BIOS 信息的办法就是:
1 .通过 EPS 表的 12H 和 14H 数据找到 TYPE 结构表,然后找到 TYPE 0 的内存地址 ( 不一定是首个 ) 。
2 .由 TYPE 0 结构区域中得出相应 BIOS 信息是否存在(存在则是上面所述的 01H,02H,03H 依次排布,不存在则是相应的位置上为 00H )。
3 .如存在信息,则从字符串区域中读取对应 BIOS 信息。
获得其他类型的 SMBIOS 结构信息的方法类似,只是 TYPE 结构区域有所不同。
相信大家都用过一些系统检测软件 , 或者至少用过 Windows 优化大师里面的系统检测。实际上,应用程序程序就可以通过访问 SMBIOS 来获得这些信息。这里举一个例子,演示如何找到 BIOS 的版本号 (BIOS Version) 和电脑的厂商 (Manufacturer) 。不过我们不采用编程的方式,而是通过系统自带的debug 命令来进行相关的操作。
内存的物理地址区间 0x000F0000-0x000FFFFF 使用了 32 位中的 20 位,先要在这个区间内寻找关键字 “ _SM_” ,以定位到 EPS 表。我们要采用 20位地址模式,即高位字左移 12 位,因此值 0x000F0000 表示为 F000:0000 ,地址区间为 F000:0000 - F000:FFFF 。在 cmd 中输入 "debug", 回车 , 这样就进入了 debug 环境,它的命令提示符为 - , 以后出现在 - 后面的内容都为将要输入的命令。
在地址区间内搜索关键字 "_SM_" 的起始地址:
-s f000:0 ffff '_SM_'
以我的电脑为例 , 响应可能是下面这样的:
-s f000:0 ffff '_SM_'
F000:6C00
这个地址就是 EPS 表的起始地址。也有可能你的电脑会显示多个查找结果,不妨先随意选择一个进行下面的操作:
-d F000:6C00
会打印该地址后面 16*8 个字节的内容,可能的响应:
- -d F000:6C00
- F000:6C00 5F 53 4D 5F 16 1F 02 1F-4B 01 00 00 00 00 00 00 _SM_....K.......
- F000:6C10 5F 44 4D 49 5F 3D 98 09-10 30 0E 00 3C 00 00 00 _DMI_=...0..<...
- F000:6C20 52 53 44 20 50 54 52 20-DE 4E 45 43 20 20 20 00 RSD PTR .NEC .
- F000:6C30 34 95 F7 0D 00 00 00 00-00 00 00 00 00 00 00 00 4...............
- F000:6C40 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
- F000:6C50 24 46 53 58 56 0C F8 00-B1 00 E0 00 00 00 00 00 $FSXV...........
- F000:6C60 5F 33 32 5F 20 D7 0F 00-00 01 D6 00 00 00 00 00 _32_ ...........
- F000:6C70 24 50 44 4D 01 0B 1A 5D-88 00 F0 00 00 00 00 00 $PDM...]........
如果嫌显示的行数太少 , 可以用 -d 继续打印后面的信息。注意到了吗, _SM_ (其 ASCII 编码为 5F 53 4D 5F ),还有 10H 偏移处(即偏移 16 个字节)的 _DMI_ 。如果你在上一步中有多个结果,那么只要某个结果通过 d 命令查看的结果符合这两个特征,我们就可以用它来继续下面的操作。至这一步, EPS 已经找到了。
EPS 的偏移 18H 处的 4 字节为 10 30 0E 00 ,是 SMBIOS 结构表的 32 位地址。这 4 个字节是从低字节到高字节,因为 x86 采用小端字节序,低字节存放的是高位的值,因此重新写成 " 高位 低位 " 的格式就是 000E 3010 ,转换成 20 位格式就把高位左移 12 位,变成 E000:3010 的形式。打印该地址处的内容:
-d e000:3010
可能的响应:
- -d e000:3010
- E000:3010 00 14 00 00 01 02 F5 E4-03 07 90 DF 99 7C 00 00 .............|..
- E000:3020 00 00 05 03 4E 45 43 20-20 20 20 20 00 4E 4F 54 ....NEC .NOT
- E000:3030 45 20 42 49 4F 53 20 56-65 72 73 69 6F 6E 20 2F E BIOS Version /
- E000:3040 33 36 39 41 30 36 30 30-20 00 30 39 2F 31 30 2F 369A0600 .09/10/
- E000:3050 32 30 30 33 00 00 01 19-01 00 01 02 03 04 8B B0 2003............
- E000:3060 DE 65 92 46 40 EB 86 FE-56 28 BD 80 79 13 06 4 E .e.F@...V(..y..N
- E000:3070 45 43 20 43 6F 6D 70 75-74 65 72 73 20 49 6E 74 EC Computers Int
- E000:3080 65 72 6E 61 74 69 6F 6E-61 6C 00 50 43 2D 43 56 ernational.PC-CV
首先,第一个字节 ( 零偏移处 ) 是 00 ,根据规范,这说明从这里开始的信息为 TYPE 0 结构,也即 BIOS 信息区。第二个字节 ( 偏移 01H 处 ) 是 14,说明 TYPE 0 区域的基本大小是 14H 。根据规范,偏移 02H 处的两个字节为 00 00 ,表示句柄。偏移 04H 处的字节为 01 ,表示 BIOS 厂商这个字符串在 Type 0 字符串区域中的编号,即字符串区域中的第 01 个字符串就 BIOS 厂商。偏移 05H 处的字节为 02 ,表示 BIOS 版本字符串在字符串区域中的编号。偏移 08H 处的字节为 03 ,表示 BIOS 发布日期字符串在字符串区域中的编号。
TYPE 0 区的基本大小为 14H ,则偏移 14H 处是 TYPE 0 字符串区域的开始。偏移 14H 处的值是 4E (右面对应的 ASCII 字符是 N ),这就是 TYPE 0 字符串区域的开始,它们是不包括在 TYPE 的大小计算中的。每个字符串不定长,由 00H 作为结束标志。熟悉 C/C++ 的人应该对这一标志符比较亲切吧。从第一个字符串依次编号为 01 , 02... 。第 01 个字符串为 ”NEC” (这里结束标志 00 前还插入了若干个控制字符 20 ),是 BIOS 厂商,第 02 个字符串为 "NOTE BIOS Version / 369A0600 " ,是 BIOS 版本,第 03 个字符串为 ”09/10/2003” ,是 BIOS 发布日期,这样我们的第一个目标 BIOS 版本就找到了。
整个字符串区的结束用 00 来标志,又根据字符串的结束符为 00 ,所以找到 00 00 ,从 00 00 的下一个地址开始就是下一个信息区了。这个例子中,就是 E000:3056 处,内容是 01 ,作为下一个区域的第一个字节,它标志着此 TYPE 的类型 , 这里就是 TYPE 1, 也即 System Information 。
根据与 TYPE 0 类似的方法 , 我们从 TYPE 1 的偏移 01H 处得到 TYPE 1 的大小为 19H , 而 SMBIOS 规范中说明, TYPE 1 的偏移 04H 处即为Manufacturer 字符串的编号,这里即为 01 。转到 TYPE 1 的偏移 19H 处,即为 TYPE 1 的字符串区的开始,由于我们要找的信息编号为 01 ,所以从这里开始的信息 "NEC Computers International" 即为厂商的信息。
SMBIOS 支持在保护模式下工作,因此,在 Windows 中使用 16 位汇编进行程序编写将使得对物理内存进行访问变得非常容易。
从 SMBIOS 2.3 版本开始,兼容 SMBIOS 的实现必须包含以下 10 个数据表结构: BIOS 信息 (Type 0) 、系统信息 (Type 1) 、系统外围或底架(Type 3) 、处理器信息 (Type 4) 、高速缓存信息 (Type 7) 、系统插槽 (Type 9) 、物理存储阵列 (Type 16) 、存储设备 (Type 17) 、存储阵列映射地址(Type 19) 、系统引导信息 (Type 32) 。
附加信息 (Type 40) 、板载设备扩展信息 (Type 41) 、管理控制器主机接口 (Type 42) 。
不活动指示 (Type 126) 、表格结束指示 (Type 127) 。
SMBIOS 的大部分结构表数据在 CIM 模型中都有对应的实现,比如底架信息对应 CIM_Chassis ,处理器信息对应 CIM_Processor ,内存信息对应CIM_Memory 等。
名称 |
长度 |
描述 |
|
00h |
TYPE 号 |
1BYTE |
结构的TYPE 号,此处是0 |
01h |
长度 |
1BYTE |
TYPE 0 格式区域的长度,一般为14h ,也有13h |
02h |
句柄 |
2BYTE |
指向本结构的句柄 |
04h |
Bios 厂商信息 |
1BYTE |
此处是bios 卖方的信息,可能是OEM 厂商名,一般为01h ,代表紧随格式区域后的字符串区域的第一个字符串 |
05h |
BIOS 版本 |
1BYTE |
BIOS 版本号,一般为02h ,代表字符串区域的第二个字符串 |
06h |
Bios 开始地址段 |
2BYTE |
用于计算常驻BIOS 镜像大小的计算,方法为 (10000h-BIOS 开始地址段)×16 |
08h |
BIOS 发布日期 |
1BYTE |
一般为03h ,表示字符区第三个字符串 |
09h |
BIOS ROM size |
1BYTE |
计算方法为(n +1 )×64K ,n 为此处读出数值 |
0Ah |
BIOS 特征 |
8BYTE |
Bios 的功能支持特征,如PCI,PCMCIA,FLASH 等 |
12h |
BIOS 特征扩展 |
不定 |
从2.4 版开始包含两个扩展字节(12h-13h) ,以及字节14h-17h |
14h |
BIOS 版本主号 |
1BYTE |
若系统不支持此域,则值设为ffh |
15h |
BIOS 版本从号 |
1BYTE |
若系统不支持此域,则值设为ffh |
16h |
内置控制器固件的版主号 |
1BYTE |
若系统不支持此域,则值设为ffh |
17h |
内置控制器固件的版从号 |
1BYTE |
若系统不支持此域,则值设为ffh |
BIOS 特征域表示BIOS 对一些特性的支持情况,Bit 1 和Bit 1 保留,Bit 2 未知,Bit 3 表示本BIOS 特征域是否被支持。
2 、系统信息 (Type 1) : SMBIOS 实现只关联一个单一的系统实例,并且包含且只包含一个系统信息结构。
位置 |
名称 |
长度 |
描述 |
00h |
TYPE 号 |
1BYTE |
结构的TYPE 号,此处是1 |
01h |
长度 |
1BYTE |
格式区域总长度,2.0 版为08h ,2.1-2.3.4 版为19h,从2.4 版开始为1Bh |
02h |
句柄 |
2BYTE |
指向本结构的句柄 |
04h |
电脑制造商 |
1BYTE |
一般为01h ,表示在字符串区域中的编号 |
05h |
产品名称 |
1BYTE |
|
06h |
版本号 |
1BYTE |
在字符串区域中的编号 |
07h |
序列号 |
1BYTE |
在字符串区域中的编号 |
09h |
UUID |
16BYTE |
通用唯一标识符 |
18h |
唤醒类型 |
BYTE |
用来标识导致系统开电启动的事件 |
19h |
SKU 号 |
BYTE |
在字符串区域中的编号,SKU 号通常为产品ID 或采购订单号 |
1Ah |
产品家族 |
1BYTE |
在字符串区域中的编号 |
time_low :偏移 00h 处, 4BYTEs ,为时间戳的低位域部分。
time_mid : 04h 处,2BYTEs , 为时间戳的中间域部分。
time_hi_and_version : 06h 处, 2BYTEs ,为时间戳的高位域,同时还包含版本号。
clock_seq_hi_and_reserved : 08h 处, 1BYTE ,时钟序列的高位域部分,同时还包含保留部分。
clock_seq_low : 09h 处, 1BYTE ,时钟序列的低位域部分。
Node : 0Ah 处, 6BYTEs ,唯一结点标识符。
其他各个结构表的详细格式可参考 SMBIOS 规范,在 http://www.dmtf.org/standards/smbios 处。这里主要概述一下主要结构表所包含的对我们有用重要信息。
基板或模块单元信息 (Type 2) :制造商、产品名、版本、序列号、资产标签、特征标志、基板在底架上的位置、底架句柄、基板类型、包含的对象句柄个数、包含的个各对象句柄。
高速缓存信息 (Type 7) :插座指示、缓存配置、最大缓存容量、已安装的容量、支持的 SRAM 类型、当前 SRAM 类型、缓存速率、纠错类型、系统缓存类型、关联性。
端口连接器信息 (Type 8) :例如并口、串口、键盘、鼠标器端口等都属于端口连接器。包含的信息有内部引用指示符、内部连接器类型、外部引用指示符、外部引用类型、端口类型。
系统插槽 (Type 9) :插槽指示符、插槽类型、插槽数据总线宽度、当前是否在使用、插槽长度、插槽 ID 、插槽特征 1 、插槽牲 2 、段组编号、总线编号、设备 / 函数编号。
OEM 字符串 (Type 11) :由 OEM 指定的描述字符串。
系统配置选项 (Type 12) :用来配置基板跳线和开关的信息字符串。
BIOS 语言信息 (Type 13) :可安装的语言、标志位字节、保留的 15 字节、当前语言。这里的语言是指英语、法语、汉语等国家语言,而不是计算机编程语言。
组相联 (Type 14) :组名、本项的类型、本结构的句柄。级相联用于指明某些部件的布局或层次,例如指明两个 CPU 共享一个外部缓存系统。
- union {
- struct {
- short IndexAddr;
- short DataAddr;
- } IO;
- long PhysicalAddr32;
- short GPNVHandle;
- } AccessMethodAddress;
每个日志记录的格式都包含 8 字节的记录头部(事件类型、长度、日期时间域),后跟不定长的日志数据。
物理存储器阵列 (Type 16) :位置(系统板卡或附加板卡上)、存储功能、内存纠错、最大容量、存储错误信息句柄、存储设备数目、已扩展的最大容量。
存储设备 (Type 17) : 用于描述物理存储器阵列中的单个存储设备。在物理存储器阵列中的句柄、存储错误信息句柄、存储总宽度、数据宽度、存储容量、形体尺寸、设备集、设备定位 器、记忆槽定位器、存储器类型、类型额外细节、速率、制造商、序列号、资产标签、部件号码、属性标志、已扩展的容量、已配置的存储时钟速率。
32-bit 错误信息 (Type 18) :错误类型、错误粒度、错误操作、特定于制造商的错误表现、存储阵列错误地址、设备错误地址、错误解析。
存储阵列映射地址 (Type 19) :起始地址、结束地址、存储阵列句柄、分区宽度、已扩展的起始地址、已扩展的结束地址。
存储设备映射地址 (Type 20) :起始地址、结束地址、存储设备句柄、存储阵列映射地址句柄、分区行位置、交叉位置、交叉的数据深度、已扩展的起始地址、已扩展的结束地址。
内置指针设备 (Type 21) :指针设备类型、接口类型、按钮个数。
智能电池 (Type 22) :位置、制造商、制造日期、序列号、设备名、设备化学属性、设计容量、设计电压伏特数、 SBDS 版本号、电池数据的最大错误百分比、 SBDS 序列号、 SBDS 制造日期、 SBDS 设备化学属性、设计容量倍增因子、特定于 OEM 的信息。
系统引导信息 (Type 32) :保留域 (00h) 、引导状态描述 (10 字节 ) 。引导状态描述主要有“没有检测到错误”、“没有可引导的媒介”、“操作系统载入失败”、“ BIOS 硬件检测失败”、“操作系统硬件检测失败”、“用户请求引导(通过一个按键)”、“违反系统安全”、“预先请求映像(通过 PXE 引导)”、“系统监控记时器激活,导致系统重启”,特定于厂商引导状态描述等。
IPMI 设备信息 (Type 38) : BMC 接口类型、 IPMI 规范修改版本、 I2C 从地址、 NV 存储设备地址、基地址、基地址修饰符 / 中断信息、中断号。
不活动指示 (Type 126) :用来表明某个 SMBIOS 结构当前不活动,因此不应用被上层的软件使用。它没有字符串区域,只有结构头部(即三个头部域类型、长度、句柄)。
表格结束指示 (Type 127) :表示整个 SMBIOS 结构表的结束。它也只有结构头部,没有字符串区域。
可以看出,很多设备都包含一些类似的信息域,比如制造商、产品 ID(SKU 号 ) 、产品名称、版本、出厂日期、序列号、资产标签号、设备类型等。
应用软件可以使用下面的方法来解析基于表格的 SMBIOS 结构。 FindStructure 函数用于查找指定类型的第一个结构(注意同一个类型的结构可能会多个),返回这个结构的句柄,如果没找到,则返回 0xFFFF 。 TableAddress 和 StructureCount 的值可以通过在内存中定位 EPS 表来获得, EPS 中偏移 18h 处即为 TableAddress 的值,偏移 1Ch 处即为 StructureCount 的值。
- typedef unsigned short ushort;
- typedef unsigned char uchar;
- typedef struct {
- uchar Type;
- uchar Length;
- ushort Handle;
- } HEADER;
- ushort FindStructure(char* TableAddress, ushort StructureCount, uchar Type) {
- ushort i, handle;
- uchar lasttype;
- i=0;
- handle=0xFFFF;
- /* 从整个SMBIOS的首个结构开始搜索指定类型的第一个结构 */
- while(i<StructureCount && handle==0xFFFF) {
- i++;
- lasttype=((HEADER *)TableAddress)->Type; /* 获取当前结构的类型 */
- if(lasttype==Type) {
- handle=((HEADER *)TableAddress)->Handle;
- }else {
- /* 移动到当前结构的字符串区域处 */
- TableAddress+=((HEADER *)TableAddress)->Length;
- while(*((int *)TableAddress)!=0) /* 移动到字符串区域的结尾符0000h处 */
- TableAddress++;
- TableAddress+=2; /* 跳过0000h,移动到下一结构起始处 */
- }
- }
- return handle;
- }
SMBIOS信息概述 -- DMI相关推荐
- SMBIOS信息概述 – DMI
先介绍 DMI . DMI 是英文单词 Desktop Management Interface 的缩写,也就是桌面管理界面,它含有关于系统硬件的配置信息.计算机每次启动时都对 DMI 数据进行校验, ...
- 1.6 x86读取smbios信息
x86软件中需要读取当前的系统信息,区别出不同的系统类型,以实现不同的功能.如:A.B.C.D等等.前面也有通过桥片PCI DEVICE ID来判断的方法,但是这种方法碰到桥片相同但是系统功能不同方法 ...
- 量子计算与量子信息之量子信息概述
量子计算与量子信息之量子信息概述 上一节中,我们谈过了量子计算的概述,最后一部分是简单介绍了一下量子算法的实现及其应用,现在,这里我们来进行一下量子信息的概述. 文章目录 量子计算与量子信息之量子信息 ...
- 如何定制虚拟机smbios信息
(文章来自作者维护的社区微信公众号[虚拟化云计算]) (目前有两个微信群<kvm虚拟化>和<openstack>,扫描二维码点击"云-交流",进群交流提问) ...
- 硬件信息获取--DMI
一.DMI简介: DMI (Desktop Management Interface, DMI)就是帮助收集电脑系统信息的管理系统,DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行. SMB ...
- UEFI 基础教程 (十一) - Shell下读取SMBIOS信息
一. 编写源代码 编写UEFI Application 代码C:\edkii\OvmfPkg\MyHelloWorldSMBios\MyHelloWorldSMBios.c, EFI_STATUS E ...
- 磁盘SMART信息概述
一.SMART概述 硬盘的故障一般分为两种:可预测的(predictable)和不可预测的(unpredictable).后者偶而会发生,也没有办法去预防它,例如芯片突然失效,机械撞击等.但像电机轴承 ...
- Linux下读取smBIOS源码,Linux下读取SMBIOS信息
来源:http://www.linuxde.net/2013/02/12499.html uefi shell下使用smbiosview linux下使用dmidecode 或者amidecode(a ...
- 监管平台审核信息概述
前言: 机动车检验监管平台是由公安部无锡科研所开发的一套软件系统.该系统应用于各省市车管所对其管辖区内检车站对机动车安全性能检测进行监督与管理.各检车站必须通过车管所审批才能有访问此监管平台的权限(这 ...
最新文章
- RNN失宠、强化学习风头正劲,ICLR 2019的八点参会总结
- 各大型网站架构分析收集Z
- 机器学习的理论知识点总结
- office卸载工具、安装工具
- mysql输入中文出现 号_MySQL插入中文数据出现?号
- 2014.8.20日结
- c++输入一个整数判断是否为完全平方数_[leetcode/lintcode 题解] 谷歌面试题:完美平方...
- Python 开始吧
- EasyUI+MVC+EF简单用户管理Demo(问题及解决)
- “拯救网站运维经理赵明”已近尾声
- 拓端tecdat|Python之LDA主题模型算法应用
- 【Android自定义控件】Android自定义虚线三
- 腾讯管家for android,腾讯手机管家(原QQ手机管家)V6.1.0 for Android 官方版
- Post man 使用教程
- ACM/ICPC 2018亚洲区预选赛北京赛站网络赛-B:Tomb Raider(模拟+二进制枚举子串)
- 基本类型为空导致线上空指针异常问题 java.lang.NullPointerException: cannot unbox null value
- 推进网络强国建设,筑牢网络安全屏障
- pikachu靶场 RCE SSRF Unsafe Fileload Over permission
- shell脚本编程 实例讲解
- go micro微服务资料