1.6 x86读取smbios信息
x86软件中需要读取当前的系统信息,区别出不同的系统类型,以实现不同的功能。如:A、B、C、D等等。前面也有通过桥片PCI DEVICE ID来判断的方法,但是这种方法碰到桥片相同但是系统功能不同方法就无能为力了。现有的代码已经实现,研究了一下原理,整理了一下相关资料。
1、SMBIOS概念
SMBIOS(System Management BIOS)是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。
简单的说SMBIOS是x86 bios遵循的一个标准,bios把一些硬件信息按照一定的标准格式保存在内存当中,应用软件可以通过读出这些数据来获取想要的信息。
2、SMBIOS读取方法
bios一般把smbios信息保存在物理内存000F0000h 至 000FFFFFh之间,BIOS内容可以通过文件”/dev/mem”读取。
- ⑴打开”dev/mem”文件
- ⑵通过mmap(),将文件的内容映射到进程的空间,并通过memcpy()将BIOS内容考到相应缓冲区。之所以不用文件的read(),而用mmap()的原因是后者能解决在IA-64机时read()所遇到的问题。
- ⑶通过SMBIOS的规范,读出内容。
3、SMBIOS信息解析
- ⑴首先通过找读出的一段数据内容中的锚字符”SM“找到smbios的entry point。
- ⑵再通过entry point中指定的地址和长度,找到对应smbios的信息表项,我们读系统名称信息的表项为其中的type2。
4、实例:
目前DMI有多个版本,大多为2.0、2.1、2.2,对于我们主板BIOS中所使用的DMI版本,可使用WINXX自带的DEBUG程序来测试。
在WINXX的MS-DOS模式下,键入DEUBG。
c:\debug
-s f000:0 ffff '_SM_'(SM必须大写) 回车
f000:13e0
如果显示了一个地址, 则此 BIOS 支持至少 DMI 2.1. 如果没有, 再试试下面的
c:\debug
-s f000:0 ffff '_DMI_'(DMI必须大写) 回车
f000:13e0
(如果显示了一个地址, 则此 BIOS 仅支持 DMI 2.0. 如果没有, 那么 连 DMI 2.0 都不支持)
确认 BIOS 支持 DMI 2.10 或 DMI 2.20, 进行以下操作:
c:\debug
-d f000:13e0 回车(f000:13e0 是你上面的得到的结果,每个人不同哦)
具体以你的主板BIOS为准。这里以技嘉6OXE F7版BIOS为便。请参考以下屏幕图片:
02 02 意味着 DMI 2.20
02 01 意味着 DMI 2.10
本文来自博客园,作者:pwl999,转载请注明原文链接:https://www.cnblogs.com/pwl999/p/15535074.html

浙公网安备 33010602011771号