背景
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);确定标头可接受的虚拟值应该不会太难。我将其作为练习留给读者,至少目前是这样;)