4. SMBIOS数据结构
SMBIOS(System Management BIOS)以“结构表”的方式描述平台硬件与固件信息。整张表由一条条结构(Structure)顺序拼接而成,每条结构都以一个固定长度的头部(Header)开始,后面紧跟与类型相关的格式化区域(Formatted Area),再以一组以 0x00 结尾的字符串集合(String Set)收尾。理解 Type 0~Type 3 这四类最基础的结构,是后续定制 Type 11、Type 17、Type 41 等复杂结构的前提。
[Type 1B][Length 1B][Handle 2B] → [Formatted Area (Length-4) B] → [String1\0][String2\0]…[0x00]
其中 Length 只统计头部与格式化区域,不含字符串区;字符串区以“双零”结束。
下面这张图把四种常见类型放在同一张 SMBIOS 表中,展示它们的字段构成、字符串引用关系以及 Handle 的定位作用。
一、核心原理:头部、格式化区与字符串区
每条 SMBIOS 结构的前 4 个字节含义固定:Type 表示结构类别,Length 表示头部加格式化区的总长度,Handle 是该结构在表中的唯一句柄。格式化区字段的偏移量由规范严格定义,例如 Type 0 的 Vendor 位于偏移 0x04,BIOS Version 位于 0x05,Release Date 位于 0x08。字符串字段本身只保存一个字节的索引值,0 表示“无字符串”,1 表示字符串区中的第 1 条,以此类推。
字符串区紧跟在格式化区之后,每条字符串以 0x00 结尾,整个字符串集合再以一个额外的 0x00 结束。这种“双零结尾”设计让解析器可以明确知道字符串区何时结束,从而正确跳到下一条结构。
二、四类基础结构详解
| 类型 | 名称 | 典型 Handle | 核心字段 | 定制关注点 |
|---|---|---|---|---|
| Type 0 | BIOS Information | 0x0000 | Vendor、BIOS Version、Release Date、ROM Size、Characteristics | 版本号与日期需与固件实际一致,避免误判升级 |
| Type 1 | System Information | 0x0100 | Manufacturer、Product Name、Serial Number、UUID、SKU | UUID 必须唯一,序列号不可重复 |
| Type 2 | Baseboard Information | 0x0200 | Manufacturer、Product、Version、Serial、Asset Tag、Chassis Handle | Chassis Handle 必须指向有效 Type 3 |
| Type 3 | System Enclosure | 0x0300 | Manufacturer、Type、Version、Serial、Boot-up State、Power Supply State | 机箱类型编码需符合 SMBIOS 规范枚举值 |
三、方法流程:从需求到结构落地
- 确定字段来源:明确哪些信息来自固件配置、哪些来自产线烧录、哪些需要运行时生成(如 UUID)。
- 分配 Handle:为每条结构分配唯一句柄,并保证跨结构引用(如 Type 2 → Type 3)指向正确。
- 填充格式化区:按规范偏移写入数值字段,字符串字段先写索引占位。
- 构建字符串区:按索引顺序写入字符串,末尾补双零。
- 校验长度与校验和:确认 Length 与实际字节数一致,并检查结构表整体完整性。
四、案例场景:定制一台工控机的 SMBIOS
假设需要为某工控机定制 SMBIOS,要求:BIOS 版本显示为 “1.2.3”,整机厂商为 “Vendor-A”,主板型号为 “MB-Z790”,机箱类型为 “ATX”。定制时先构造 Type 0,写入版本与日期;再构造 Type 1,写入厂商、机型与 UUID;接着构造 Type 2,写入主板信息并将 Chassis Handle 指向 Type 3;最后构造 Type 3,写入机箱厂商与类型编码。四条结构共享同一字符串区,索引从 1 开始依次排列。
Type 0 Handle 0x0000 Len 0x18
Vendor = 0x01 -> "Vendor-A"
BIOS Version = 0x02 -> "1.2.3"
Release Date = 0x03 -> "2024-06-01"
Type 1 Handle 0x0100 Len 0x1B
Manufacturer = 0x01 -> "Vendor-A"
Product Name = 0x04 -> "Model-X"
Serial Number = 0x05 -> "SN-0001"
Type 2 Handle 0x0200 Len 0x0F
Product = 0x06 -> "MB-Z790"
Chassis Handle= 0x0300
Type 3 Handle 0x0300 Len 0x15
Manufacturer = 0x01 -> "Vendor-A"
Version = 0x07 -> "Chassis-ATX"
Type = 0x03 (ATX)
五、误区与复盘
掌握 Type 0~Type 3 的字段布局与字符串引用机制后,再扩展到 Type 4(处理器)、Type 7(缓存)、Type 16(内存阵列)、Type 17(内存设备)等结构时,就能沿用同一套“头部—格式化区—字符串区”的解析思路,快速定位字段偏移并完成定制写入。