我一直有这个问题,但在阅读手册页和在线搜索后没有得到答案。有了解这方面知识的请评论。
我理解SMBIOS表或DMI表是dmidecode定位和解析的。但它从哪里得到呢?是Linux下的文件格式吗?
看起来它来自/dev/mem
root@aw42e ~]# strace -F -e open dmidecode -t 17
<snip>
open("/sys/firmware/efi/systab", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/proc/efi/systab", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/dev/mem", O_RDONLY) = 3
SMBIOS 2.5 present.
open("/dev/mem", O_RDONLY) = 3
Handle 0x0016, DMI type 17, 27 bytes
Memory Device
<snip>
/dev/mem
被描述为
mem 是一个字符设备文件,它是主存的映像 电脑。例如,它可以用于检查(甚至修补) 系统。 mem 中的字节地址被解释为物理内存 地址。
所以回答,它包含在 /dev/mem
我正在寻找更多信息,但我假设内核在启动时将 DMI 表插入内存 - 来自
man dmidecode
当您运行它时,dmidecode 将尝试查找 DMI 表。如果它 成功后,它将解析该表并 显示如下记录列表:
DMI表中定义的数据是行业标准;适用于 Linux 和 Windows(以及其他 PC 操作系统):
https://en.wikipedia.org/wiki/System_Management_BIOS
系统管理 BIOS (SMBIOS) 规范定义数据 可用于读取信息的结构(和访问方法) 存储在计算机的 BIOS 中。大约 1999 年,它成为 分布式管理任务组 (DMTF) 的领域...
大约在同一时间,微软开始要求 OEM BIOS 供应商支持接口/数据集,以便 微软认证...
您可以阅读有关 Linux 实现的更多信息 - 以及用于将实际原始数据导出到用户空间的驱动程序(“/sys/class/dmi/”、“/dev/mem”等) - 这里:
用于访问 DMI 信息的实际内核代码在这里(您的发行版/版本可能有所不同):
https://elixir.bootlin.com/linux/latest/source/drivers/firmware/dmi-sysfs.c
DMTF 定义的 SMBIOS 标准。您可以在https://www.dmtf.org/standards/smbios/
找到相关pdfSMBIOS 可以是 32 位或 64 位,无论 CPU 架构如何。就像64位系统可以有32位smbios结构一样。规范版本 3.7.0 描述了 smbios 在 5.2.1(针对 32 位)和 5.2.2(针对 64 位)的位置。
注意:UEFI BIOS 和Legacy BIOS 不同,smbios 的位置不同。如果 BIOS 是旧版,您将在
0xF0000-0xFFFFF之间的内存中寻找
_SM_
(对于 32 位)或 _SM3_
(对于 64 位)。您应该同时寻找 _SM_
和 _SM3_
。 UEFI 非常有趣。 UEFI 为 UEFI 应用程序入口点提供了 system_table
接口。这是一个ms c结构(字节对齐不同)。该结构有一个由多个表组成的数组,例如 ACPI、SAL、SMBIOS 等。要查找 smbios 结构,您可以搜索 v2 或 v3 smbios 结构的相关 GUID。
找到smbios结构后,需要借助版本进行解析。 v2 和 v3 具有不同的结构布局。 smbios 结构为您提供数据数组的指针。
Linux 内核将该数组缓存到 sysfs 中。
dmidecode 使用缓存数据或如上所述查找数据。
该数组使用 dmtf 提供的规范进行解析(我在上面提到了链接)。