背景

背景

背景

dmidecode 实用程序能够使用--dump-bin选项创建原始二进制转储:

root@here:~$ dmidecode --dump-bin foo.dump

它可以在另一台机器上重复使用,产生的效果就像 dmidecode 在原始机器上运行一样:

me@elsewhere:~$ dmidecode --dump-bin foo.dump
# dmidecode 2.12
SMBIOS 2.7 present.
68 structures occupying 2688 bytes.
Table at 0xBAE9D000.
[...]

我确实有来自某些机器的这些二进制文件,并使用它们来测试包装 dmidecode 的脚本(因此,我需要模拟 dmidecode 行为,就好像硬件设置不同一样)。

问题

但是在几台机器上,我没有原始二进制文件,但是具有 4.* 内核公开的 /sys/firmware/dmi/tables 的副本。 kernel.org 上的文档说:

[...] dmi/tables 通过 sysfs 提供原始 SMBIOS 入口点和 DMI 表,作为从 /dev/mem 读取它们的实用程序的替代方案。原始 SMBIOS 入口点和 DMI 表以二进制属性形式呈现,可通过以下方式访问:

/sys/firmware/dmi/tables/smbios_entry_point
/sys/firmware/dmi/tables/DMI

使用这两个表可以获取完整的DMI信息。

问题

是否可以使用 /sys/firmware/dmi/tables 文件重新构建(在 Bash/Python/Perl/... 脚本中)原始二进制转储,以便可以像第一个示例一样重新使用它?

我尝试将这些文件放在一起,但没有成功(Invalid entry length (0). DMI table is broken! Stop.)。

答案1

在此输入图像描述

在此输入图像描述

在此输入图像描述

您可以参考代码https://github.com/mirror/dmidecode/blob/master/dmidecode.c。祝你好运。

在此输入图像描述

示例:7f + 00 + 80 + 30 + 7b = 18a

18a 保持 8bit = 8a

DMI 的新地址被硬编码为 0x20。

答案2

如果您将 dmidecode 的十六进制转储smbios_entry_point与二进制输出进行比较,您会发现它是相似的到 dmidecode 输出的字节 0-31。同样,DMI匹配字节 32+。字节 32 缺失;我认为它始终为空。

它看起来足够接近,我希望它能发挥作用。

echo -en '\0' >NUL
sudo cat /sys/firmware/dmi/tables/smbios_entry_point NUL /sys/firmware/dmi/tables/DMI >table
dmidecode --from-dump table

但是,dmidecode 崩溃并显示以下输出:

# dmidecode 2.12-dmifs
Reading SMBIOS/DMI data from file table.
SMBIOS 2.8 present.
Bus error (core dumped)

SMBIOS/DMI 规范是可在互联网上找到(pdf);确定标头可接受的虚拟值应该不会太难。我将其作为练习留给读者,至少目前是这样;)

相关内容