//百度空间的功能比起CSDN确实差的太多啊。
前面说了概念,下面看如何快速查看,其实很多前辈谢了不少,我也借鉴借鉴。
1.debug方式查看SMBIOS信息
内存的物理地址区间 0x000F0000-0x000FFFFF 使用了 32 位中的 20 位,先要在这个区间内寻找关键字 “ _SM_” ,以定位到 EPS 表。我们要采用 20 位地址模式,即高位字左移 12 位,因此值 0x000F0000 表示为 F000:0000 ,地址区间为 F000:0000 -F000:FFFF 。在 cmd 中输入 "debug", 回车 , 这样就进入了 debug 环境,它的命令提示符为 - , 以后出现在 - 后面的内容都为将要输入的命令.、
我们知道偏移16H是结构表的长度,18H是结构表的内存地址,1CH是结构表数目。由图我们可以看到18H的4个BYTE为80 92 0E 00,这是SMBIOS结构表的32bit地址。4个字节由低到高,X86是小端模式,所以低字节放高位字节。所以其地址为:00 0E 92 80,再由地址计算方法可得:把00 0E左移12位,得 E000:9280。打印此地址内容:
根据规范可知从offset 00H为TYPE0结构,即BIOS Information,
offset 01h为TYPE0的结构区域大小:18H,表示offset 18H为字符串区域。offset 18H为48H,查看ASCII表可知对应的是'H'.
offset 02H的两个byte为句柄00 00。
offset 04H为BIOS产生信息,01->代表紧随格式区域后的字符串区域的第一个字符串为BIOS厂商信息。
0ffset 05h为BIOS VEISION:02即第二个字符串表示BIOS版本信息。
offset 06h的2BYTE为BIOS开始地址(用于计算常驻BIOS 镜像大小的计算,方法为((10000H-BIOS 开始地址段)×16 )即10000H x 16=FFFFFH,也就是1M的最上端,在legacy BIOS里基本都是如此。
offset 08H的1BYTE是03,表示字符串第三个字节表示BIOS发布日期。
offset 09H的1BYTE是1FH表示BIOS ROM Size(计算方法为(n +1 )×64K ,n 为此处读出数值 )(1F+1) x 64k=20H x 64k=2048K=2M。offset 0AH的8BYTE为BIOS特征,具体可以查看SMBIOS spec信息。我们可以看到字符串开始offset为18H。
其他的内容可以查看相对应的SMBIOS SPEC(我们可以查看EPS结构里的偏移06H和07H,分别为02H,06H表示支持的SMBIOS版本为2.60 SMBIOS SPEC)。
注意:每个字符串都是以00H结束,所以整TYPE区域以00H结束,那么最后以00 00结束整个TYPE。我们可以看到E000:92B9为下一个TYPE的开始,这里是1,所以就是type 1(System Information)的开始。
类似TYPE1,offset 00->TYPE号为1,offset 01->此TYPE号的结构区域长度(不包含字符串区域)为1BH,offset 02h的2BYTE为句柄01,offset 04H为manufacturer信息这里为1表示第一个字符串。
注意:大家在看SPEC的时候有的时候因为咱们母语的原因,这英文确实难啃。它的结构表里面有Value为string的项大小为1BYTE,即表示其值是指向的字符串区域的哪一个字符串表示其含义。SMBIOS支持保护模式下16位的访问。