2. SMBIOS 规范基础

SMBIOS(System Management BIOS)是主板与操作系统之间交换硬件管理信息的标准接口。理解规范的版本演进、文档结构和获取途径,是进行定制开发的第一步。本章将系统梳理 SMBIOS 规范的版本脉络、文档组织方式以及如何获取最新规范。

2.1 SMBIOS 规范版本演进

SMBIOS 规范由 DMTF(Distributed Management Task Force)维护,经历了从 2.x 到 3.x 再到 3.5+ 的演进。不同版本在结构、容量和扩展能力上有显著差异。

版本系列 主要特征 Entry Point 结构 最大表长度 适用场景
2.x 经典 32 位结构,广泛兼容 SMBIOS 2.1 Entry Point (EPS) 64 KB 传统 BIOS、旧式系统
3.x 64 位结构,支持大表 SMBIOS 3.0 Entry Point (EPS) 16 MB UEFI 固件、现代服务器
3.5+ 新增 Type 42 管理控制器、扩展 Type 9 插槽信息 SMBIOS 3.0 EPS(扩展字段) 16 MB+ 数据中心、可管理性增强
版本选择建议: 新项目应优先基于 SMBIOS 3.x 或 3.5+ 开发,以获得更大的表空间和更丰富的结构类型。2.x 仅用于兼容老旧固件。

2.2 规范文档结构

SMBIOS 规范文档(DSP0134)采用 DMTF 标准文档模板,主要包含以下章节:

  • 1. 范围(Scope): 定义规范的适用领域和约束条件。
  • 2. 规范性引用(Normative References): 列出依赖的其他标准(如 ACPI、UEFI)。
  • 3. 术语和定义(Terms and Definitions): 解释关键术语,如 Entry Point、Structure Type、String。
  • 4. 约定(Conventions): 字节序、数据对齐、保留位处理规则。
  • 5. 总体架构(Overall Architecture): 描述 SMBIOS 表在内存中的布局和 Entry Point 结构。
  • 6. 结构类型定义(Structure Type Definitions): 核心章节,逐一定义 Type 0 ~ Type 42+ 的字段布局。
  • 7. 字符串和文本约定(Strings and Text Conventions): 字符串编码、终止符、最大长度。
  • 附录(Annexes): 包含示例、变更历史、供应商自定义 GUID 注册表。
开发重点: 第 5 章和第 6 章是定制开发的核心阅读区域。第 5 章决定 Entry Point 的解析方式,第 6 章决定每个 Type 结构的字段偏移和含义。

2.3 主要章节导读

对于固件开发者,以下章节需要重点精读:

章节 内容 精读理由
第 5 章 Entry Point 结构(2.1 EPS / 3.0 EPS) 定位 SMBIOS 表入口,校验签名和版本
第 6 章 Type 0 BIOS Information 固件版本、BIOS 起始地址、特性标志
第 6 章 Type 1 System Information 制造商、产品名称、序列号、UUID
第 6 章 Type 3 System Enclosure 机箱类型、资产标签、安全状态
第 6 章 Type 4 Processor Information CPU 类型、频率、核心数、升级插槽
第 6 章 Type 7 Cache Information 缓存层级、大小、类型、操作模式
第 6 章 Type 9 System Slots PCIe 插槽 ID、宽度、长度、特性
第 6 章 Type 17 Memory Device 内存大小、速度、类型、制造商、序列号
第 6 章 Type 41 Onboard Devices Extended Information 板载设备类型、描述、状态
注意: 3.5+ 版本新增了 Type 42(Management Controller Host Interface),用于描述 BMC 与主机之间的通信接口。如果项目涉及带外管理,必须阅读此 Type。

2.4 如何获取最新规范

SMBIOS 规范由 DMTF 免费提供,无需注册即可下载。以下是获取途径:

  • DMTF 官网: https://www.dmtf.org/standards/smbios — 主下载页面,提供 PDF 和 HTML 版本。
  • DSP0134 最新版本: 当前最新为 3.7.0(2024 年发布),直接搜索 DSP0134_3.7.0.pdf 即可。
  • GitHub 镜像: DMTF 在 GitHub 上维护规范仓库,地址为 https://github.com/DMTF/DSP0134,可查看历史版本和变更记录。
  • Errata 勘误表: 每个正式版本发布后,DMTF 会发布勘误表(Errata),修正印刷错误和字段歧义。建议同时下载对应版本的 Errata 文件。
下载建议: 开发时同时保留 3.2.0 和 3.7.0 两个版本。3.2.0 是广泛支持的稳定版本,3.7.0 包含最新 Type 定义。对比阅读可以快速了解新增字段。

2.5 SMBIOS 规范版本与 Entry Point 结构

Entry Point 是操作系统或固件定位 SMBIOS 表的入口。2.x 和 3.x 的 Entry Point 结构完全不同,解析时必须区分。

SMBIOS Entry Point 结构对比 SMBIOS 2.1 Entry Point Anchor String: "_SM_" (4 bytes) Entry Point Length: 0x1F (31 bytes) SMBIOS Major/Minor Version Table Maximum Size: ≤ 64 KB Table Address: 32-bit physical Number of Structures: 2 bytes Checksum: 1 byte (8-bit sum) SMBIOS 3.0 Entry Point Anchor String: "_SM3_" (5 bytes) Entry Point Length: 0x18 (24 bytes) SMBIOS Major/Minor Version Table Maximum Size: ≤ 16 MB Table Address: 64-bit physical Number of Structures: 4 bytes Checksum: 1 byte (8-bit sum)

2.6 规范文档中的关键字段解析示例

以 Type 0(BIOS Information)为例,展示规范文档中字段定义的典型格式:

Offset | Name                  | Length | Description
-------|-----------------------|--------|----------------------------------------------
00h    | Type                  | BYTE   | 0x00 (BIOS Information)
01h    | Length                | BYTE   | 0x12 (18 bytes for v2.4+)
02h    | Handle                | WORD   | Unique structure handle
04h    | Vendor                | BYTE   | String number for BIOS vendor name
05h    | BIOS Version          | BYTE   | String number for BIOS version
06h    | BIOS Starting Address | WORD   | Segment address of BIOS entry point
08h    | BIOS Release Date     | BYTE   | String number for release date
09h    | BIOS ROM Size         | BYTE   | Size in 64 KB blocks (0 = 64 KB)
0Ah    | BIOS Characteristics  | QWORD  | 64-bit feature flags
12h    | BIOS Characteristics  | BYTE   | Extension bytes (v2.4+)
       | Extension Bytes       |        |
开发提示: 在固件中填充 Type 0 时,必须确保 BIOS Characteristics 字段的位定义与规范一致。例如,Bit 3 表示“BIOS 支持即插即用”,Bit 11 表示“BIOS 支持 ACPI”。错误的位设置会导致操作系统识别异常。

2.7 规范版本选择决策流程

在项目启动阶段,按以下流程确定使用的 SMBIOS 规范版本:

SMBIOS 规范版本选择决策流程 项目启动 是否需要支持 64 位表地址? 否 是 使用 SMBIOS 2.1 使用 SMBIOS 3.0 兼容旧系统 新项目首选 表长度 ≤ 64 KB 表长度 ≤ 16 MB

2.8 规范文档中的保留字段与扩展机制

SMBIOS 规范为每个 Type 结构预留了保留字段(Reserved),用于未来扩展。定制开发时,必须遵守以下规则:

  • 读取时: 忽略保留字段的值,不依赖其默认值。
  • 写入时: 保留字段必须填 0,除非规范明确允许使用。
  • 扩展方式: 通过增加 Type 结构的 Length 字段来追加自定义字段。操作系统会通过 Length 判断结构大小。
  • 供应商自定义: 使用 Type 128~255(OEM Reserved)或 Type 42(Management Controller)的供应商扩展区域。
常见错误: 有些开发者直接在标准 Type 的保留字段中写入自定义数据,导致操作系统解析时出现校验错误或字段错位。正确的做法是增加 Length 并在末尾追加字段,或者使用 OEM 专用 Type。

2.9 本章小结