DMI信息的读取
一. 参考资料
<<System Management BIOS Reference Specification>>
版本 Version 2.3 — 12 August 1998
使用的工具有Debug 32 和 IO.EXE 。
二. 什么是DMI ?英尺英文
个人理解就是一种定制出来的结构, 按照一定格式存放计算机中各种信息。这样,软件就可以很方便的读取这些信息。这个信息通常存放在BIOS中,如图(1)
图(1)
上面是2M(单位是bit)的BIOS ROM的基本格式。在启动的时候。BIOS会将上面的DMI信息拷贝到内存中。使用各种方法读取的DMI信息实际上是在内存中。
三.DMI的读取
读取DMI信息有两种方法,一种是使用SMBIOS提供的中断,另外一种是在内存F000段搜索标志字符串。前者是v2.0规范及其之前定义的,后者是v2.1以及后继版本定义的。一般的电脑都支持这两种方法(至少要支持第一种方法)。
这篇文章只介绍使用第二种方法。
查阅规范,第9页:
这是DMI入口的格式,象一个链表的头节点一样, 称作SMBIOS Structure Table Entry Point,简称EPS。具体含义如下:
DB ‘_SM_’’ ;标志
DB ? ;CheckSum,该值与其余EPS之和应该是0
DB 01FH ;EPSD的长度,目前是31个字节
DB ? ;主版本
自始至终DB ? ;次版本
DW ? ;最大的SMBIOS Structure 长度
DB 0DH ;EPS版本
DB dup(5) ? ;这个是什么意思有什么用,我还不清楚
DB ‘_DMI_’ ;中间的,’DMI’起始标志
DB ? ;中间的CHECKSUM
DW ? ;以byte为单位SMBIOS Structure Table 的总长度, ,起始位置
由下面的浙江高考一本线Structure Table Address 竹子的英语指出.
DD ? ;4字节长的只读的SMBIOS Structure Table
DW ? ;Structure 的数量
DB ? ;SMBIOS本版,是BCD码的
找到了头,就能找到进入的位置.下面的例子是我的电脑.
从f000:0的内存搜索标志,按照上面阅读,都可以解释完整.入口在内存0F0800H处.
这个结构在spec 26页有介绍
下面的问题就是每一个structure的读取了.
参考spec李佳宜
第一个byte是类型,通俗歌曲表示这个structure代表什么信息(在P27 3.2 Required Structures and Data有描述);第二个是这个structure的长度(随着类型不同具体含义有些差别);第三个是一个标号(我自己的理解就是一个编号).
察看上图,第一个字节是0,表示
第二个字节是 14h. 对照
14h的含义应该是 12h+BIOS Characteristics数量(2个,2.3最多也只支持2个扩展);handle 是 0000; 制造商是 01h string; BIOS 版本是 02h string;
BIOS 起始段地址是 E000; BIOS 编译日期是 03h string; BIOS大小是 07h ,意思是这个rom是64k*(7+1)=512KB;BIOS特性0000 0000 7FCB DE90;扩展特性为白卤牛肉 0037h(长度应该是14h会计账户指出的).
对照spec很容易解释 0000 0000 7FCB DE90
对照spec也容易弄清楚扩展特性
再后面就是字符串了.关于字符串spec有如下描述
就是说一个字符串以0结尾,并且所有字符串都结束的时候多加一个0.
Db “Phoenix Technologies, LTD”,0 ;第一个字符串