之前为了看懂OpenBMC的MDR(Managed Data Region)这个功能,所以花了点时间研究了什么是SMBIOS,所以这篇就是非BIOS专业对SMBIOS的理解
SMBIOS Specification (dmtf.org)https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.5.0.pdfThe System Management BIOS (SMBIOS) 提供了主板和系统供应商如何通过在英特尔架构系统上扩展 BIOS 接口以标准格式呈现有关其产品的管理信息。这些讯息包含了CPU/Memory的serial number、manufacturer、speed等资料,也有PCIe Device、USB Device、或是Redfish Service等资讯,基本上都是Platform 上的韧体和硬件讯息。
访问 SMBIOS 信息
SMBIOS存储在NVRAM中,如果是non-UEFI 系统,可以通过在物理内存地址范围 000F0000h 到 000FFFFFh搜索anchor-string(_SM_),找到SMBIOS的EPS(Entry Point structure)
如果是UEFI-based 系统可以直接搜寻GUID找到(SMBIOS_TABLE_GUID, {EB9D2D31-2D88-11D3-9A16-0090273FC14D}) UEFI Specification 2.8 Errata B, May 2020
SMBIOS 结构
SMBIOS Table是由很多个SMBIOS 结构所组合而成的,每个 SMBIOS 结构都有一个格式化部分和一个可选的未格式化部分。每个结构的格式化部分都以一个 4 Byte 的标头开始。格式化部分中的剩余数据由结构类型决定,格式化部分的总长度也是如此。
以底下图为例,如果SMBIOS中有两个Type 4(Processor)的结构,表示BIOS所在的主板上有两个CPU socket
SMBIOS 结构类型
在SMBIOS Spec中有定义目前支援的SMBIOS结构类型,各家厂商的BIOS也可以在自定义范围内定义其他类型
结构的使用指南
这边用Spec中的BIOS Information (Type 0)范例介绍,确定好结构类型后,找到相对应的表,填入相对应的值,如果值的类型是STRING,就填入是未格式化区域中的第几个字串,如果没有字串,就填0
如果想写工具代码处理SMBIOS,就可以定义结构,套上去就能处理的值
当然有些值是要查表的,代码中也要产生一个表才能对应
自定义SMBIOS 结构类型
在Spec中有提到Type 128~256可供OEM defined
像是intel在Intel® Rack Scale Design BIOS & BMC Technical Guide中就有自定义像NIC,HD和PCIe等Type