3. SMBIOS Type 0 (BIOS Information):字段解析、BIOS版本/日期/厂商的编码规范、实战案例
3.1 Type 0 结构概述
SMBIOS Type 0 是系统启动时固件必须提供的基础结构,用于描述 BIOS / UEFI 固件自身的属性。该结构位于 SMBIOS Entry Point 之后的第一张表,操作系统或管理软件通过解析 Type 0 即可获取固件的厂商、版本、发布日期、运行时大小等关键信息。
💡 开发提示:Type 0 是 SMBIOS 规范中唯一强制要求实现的类型(除 Table 127 结束标记外)。BIOS/UEFI 固件开发者在移植或定制固件时,必须确保 Type 0 字段填写正确,否则会导致系统管理工具(如 dmidecode、Windows System Information)读取异常。
3.2 字段详细解析
下表列出了 Type 0 结构的所有标准字段(SMBIOS 3.7.0 规范),包括偏移量、名称、类型及说明:
| 偏移 | 字段名称 | 类型 | 说明 |
|---|---|---|---|
| 00h | Type | BYTE | 固定为 0x00 |
| 01h | Length | BYTE | 结构体总长度,SMBIOS 2.x 为 13h,3.x 为 18h |
| 02h | Handle | WORD | 唯一句柄,通常从 0x0000 开始递增 |
| 04h | Vendor | BYTE | 指向字符串表中厂商名称的索引 |
| 05h | BIOS Version | BYTE | 指向字符串表中 BIOS 版本号的索引 |
| 06h | BIOS Starting Address Segment | WORD | BIOS 代码段起始地址(实模式段地址),通常为 0xF000 |
| 08h | BIOS Release Date | BYTE | 指向字符串表中发布日期的索引 |
| 09h | BIOS ROM Size | BYTE | 以 64KB 为单位的 ROM 大小(n 表示 64KB * (n+1)) |
| 0Ah | BIOS Characteristics | QWORD | 64 位特征位掩码,定义 BIOS 支持的功能 |
| 12h | BIOS Characteristics Extension Bytes | 2 BYTEs | 扩展特征字节(SMBIOS 2.4+) |
| 14h | System BIOS Major Release | BYTE | 系统 BIOS 主版本号(SMBIOS 3.1+) |
| 15h | System BIOS Minor Release | BYTE | 系统 BIOS 次版本号(SMBIOS 3.1+) |
| 16h | Embedded Controller Firmware Major Release | BYTE | 嵌入式控制器固件主版本号(SMBIOS 3.1+) |
| 17h | Embedded Controller Firmware Minor Release | BYTE | 嵌入式控制器固件次版本号(SMBIOS 3.1+) |
🔍 关键字段解读:
- BIOS ROM Size:编码方式为
size = (n + 1) * 64KB,例如 n=0x0F 表示 1MB。若值为 0xFF,表示大小超过 16MB,需通过 Extended BIOS ROM Size 字段获取。 - BIOS Characteristics:位 3 表示“BIOS 特性支持规范”,位 4 表示“ISA 支持”,位 11 表示“ACPI 支持”,位 15 表示“支持从 CD-ROM 启动”。
- System BIOS Major/Minor Release:SMBIOS 3.1.0 新增,用于精确标识固件版本,例如 5.13 对应 Major=5, Minor=13。
3.3 BIOS 版本/日期/厂商的编码规范
Type 0 中的 Vendor、BIOS Version、BIOS Release Date 三个字段均使用字符串表索引方式存储。字符串表紧跟在结构体固定部分之后,每个字符串以 \0 结尾,最后以双 \0 结束。
3.3.1 厂商名称编码规范
- 格式:ASCII 字符串,建议使用英文大写或首字母大写。
- 示例:
"American Megatrends Inc."、"Phoenix Technologies Ltd."、"Insyde Software Corp." - 避坑:不要包含不可见字符或尾部空格;长度建议不超过 64 字节。
3.3.2 BIOS 版本号编码规范
- 格式:通常采用
主版本.次版本.修订号或厂商自定义格式。 - 示例:
"5.13"、"F.20"、"P1.10.0"、"2.3.1 build 20240315" - 规范要求:SMBIOS 3.1+ 建议与 System BIOS Major/Minor Release 字段保持一致。
3.3.3 BIOS 发布日期编码规范
- 格式:
MM/DD/YYYY(美国标准格式),必须使用两位月份、两位日期、四位年份。 - 示例:
"03/15/2024"、"12/01/2023" - 注意:不要使用
YYYY-MM-DD或DD/MM/YYYY等非标准格式,否则部分管理软件可能解析失败。
⚠️ 常见错误:部分固件在 BIOS Release Date 中填写了
"01/01/2000" 作为默认值,这会导致系统管理工具误判固件年龄。建议在量产固件中填写真实的测试完成日期。
3.4 Type 0 结构关系图
下图展示了 Type 0 结构体与字符串表在 SMBIOS 内存布局中的关系:
3.5 实战案例:解析真实固件中的 Type 0
以下案例演示如何从一台 x86 服务器固件中提取并解析 Type 0 数据。使用 dmidecode 工具获取原始二进制数据,并手动解码关键字段。
3.5.1 获取原始数据
# 使用 dmidecode 导出 Type 0 原始二进制
sudo dmidecode -t 0 -u
# 输出示例(十六进制):
# Handle 0x0000, DMI type 0, 24 bytes
# BIOS Information
# Vendor: American Megatrends Inc.
# Version: 5.13
# Release Date: 03/15/2024
# ROM Size: 16384 kB
# Characteristics:
# PCI is supported
# ACPI is supported
# ...
# Raw Data:
# 00 18 00 00 01 02 00 F0 03 0F 00 00 00 00 00 00
# 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
3.5.2 手动解码
| 偏移 | 原始值 | 解码结果 | 说明 |
|---|---|---|---|
| 00h | 0x00 | Type = 0 | BIOS Information |
| 01h | 0x18 | Length = 24 字节 | 包含 SMBIOS 3.x 扩展字段 |
| 04h | 0x01 | Vendor 索引 = 1 | 指向字符串表第 1 个字符串 |
| 05h | 0x02 | Version 索引 = 2 | 指向字符串表第 2 个字符串 |
| 08h | 0x03 | Release Date 索引 = 3 | 指向字符串表第 3 个字符串 |
| 09h | 0x0F | ROM Size = (15+1)*64KB = 1024KB | 实际为 16384 kB(16MB) |
| 14h | 0x05 | System BIOS Major = 5 | 主版本号 |
| 15h | 0x0D | System BIOS Minor = 13 | 次版本号 |
3.5.3 字符串表解析
结构体固定部分结束后,从偏移 24 (0x18) 开始读取字符串表:
偏移 24: "American Megatrends Inc.\0" → 索引 1
偏移 50: "5.13\0" → 索引 2
偏移 56: "03/15/2024\0" → 索引 3
偏移 68: 0x00 0x00 → 字符串表结束
✅ 验证结果:
- Vendor = "American Megatrends Inc."
- BIOS Version = "5.13"
- Release Date = "03/15/2024"
- ROM Size = 16 MB
- System BIOS Version = 5.13(与字符串一致)
3.6 固件开发中的常见问题与最佳实践
- 字符串表索引从 1 开始:索引 0 表示空字符串,实际字符串从索引 1 开始计数。
- ROM Size 编码上限:当 ROM 大小超过 16 MB 时,必须使用 SMBIOS 3.2+ 引入的 Extended BIOS ROM Size 字段(位于偏移 18h)。
- 日期格式兼容性:部分旧版管理软件只识别
MM/DD/YYYY格式,使用其他格式可能导致解析失败。 - 版本号一致性:BIOS Version 字符串应与 System BIOS Major/Minor Release 字段保持语义一致,避免混淆。
🛠 开发工具推荐:使用
dmidecode -s bios-vendor、dmidecode -s bios-version、dmidecode -s bios-release-date 快速验证 Type 0 字符串字段。在固件调试阶段,建议在串口日志中打印 Type 0 原始十六进制数据,便于对比分析。