3. SMBIOS Type 0 (BIOS Information):核心字段详解与填充案例
SMBIOS Type 0 结构是系统固件信息的第一张“身份证”,它向操作系统和管理软件报告 BIOS 的基本属性。本章将深入解析 BIOS Vendor、BIOS Version、BIOS Release Date 以及 BIOS Characteristics 四个关键字段的规范定义、填充规则与实战案例。
3.1 Type 0 结构概览
Type 0 结构是所有 SMBIOS 结构中必须实现的基础类型之一,其结构体长度固定为 18h(24 字节),加上可变长度的字符串区域。下表列出了该结构的核心字段布局:
| 偏移量 | 长度(字节) | 字段名称 | 说明 |
|---|---|---|---|
| 00h | BYTE | Type | 固定为 0x00 |
| 01h | BYTE | Length | 固定为 0x18 |
| 02h | WORD | Handle | 结构句柄,唯一标识 |
| 04h | BYTE | Vendor | BIOS 厂商名称字符串索引 |
| 05h | BYTE | BIOS Version | BIOS 版本号字符串索引 |
| 06h | WORD | BIOS Starting Address Segment | BIOS 入口段地址 |
| 08h | BYTE | BIOS Release Date | BIOS 发布日期字符串索引 |
| 09h | BYTE | BIOS ROM Size | ROM 大小(以 64KB 为单位) |
| 0Ah | QWORD | BIOS Characteristics | 64 位特性位图 |
| 12h | WORD | BIOS Characteristics Extension Byte 1 & 2 | 扩展特性字节 |
| 14h | BYTE | System BIOS Major Release | 系统 BIOS 主版本号 |
| 15h | BYTE | System BIOS Minor Release | 系统 BIOS 次版本号 |
| 16h | BYTE | Embedded Controller Firmware Major Release | EC 固件主版本号 |
| 17h | BYTE | Embedded Controller Firmware Minor Release | EC 固件次版本号 |
关键提示: Vendor、BIOS Version、BIOS Release Date 三个字段存储的是字符串索引值(从 1 开始计数),实际字符串内容存放在结构体末尾的字符串区域。Characteristics 字段则直接使用 64 位位图表示 BIOS 支持的特性。
3.2 字段详解与填充规范
3.2.1 BIOS Vendor(偏移 04h)
该字段指向一个以 null 结尾的 ASCII 字符串,标识 BIOS 固件的供应商名称。填充时需注意:
- 字符串必须与硬件平台的实际固件供应商一致,例如
"American Megatrends Inc."、"Phoenix Technologies Ltd."、"Insyde Software Corp."或"UEFI"(用于 UEFI 原生固件)。 - 不允许使用空字符串或占位符,操作系统管理工具(如 dmidecode、Windows WMI)依赖此字段识别固件来源。
- 如果固件基于开源项目(如 TianoCore/EDK II),建议填写实际集成商名称,而非项目名称。
3.2.2 BIOS Version(偏移 05h)
此字段指向 BIOS 固件的版本号字符串,是系统管理员识别固件更新状态的核心依据。填充规范如下:
- 版本号格式建议遵循
"主版本.次版本.构建号"或"版本日期"模式,例如"5.12"、"F.20"、"2.3.1"。 - 必须与固件实际烧录的版本严格对应,避免与 BIOS Release Date 产生逻辑矛盾。
- 对于 UEFI 固件,通常与
EFI_FIRMWARE_FILE_SYSTEM中的版本信息保持一致。
3.2.3 BIOS Release Date(偏移 08h)
该字段指向 BIOS 固件的发布日期字符串,格式必须严格遵循 "mm/dd/yyyy" 或 "yyyy-mm-dd" 标准。常见陷阱:
- 日期必须反映固件二进制文件的构建时间,而非主板生产日期或销售日期。
- 月份和日期必须使用两位数表示,例如
"03/15/2025"而非"3/15/2025"。 - 如果固件使用 UEFI Capsule 更新机制,此日期应与 Capsule 头部的时间戳对齐。
常见错误: 部分开发者将 BIOS Release Date 填充为编译工具的默认时间戳(如 1970-01-01),这会导致操作系统固件检测工具报告“未知日期”或触发安全警告。务必使用实际构建日期。
3.2.4 BIOS Characteristics(偏移 0Ah,8 字节)
这是一个 64 位的位图字段,每个 bit 代表 BIOS 是否支持某项特定特性。SMBIOS 规范定义了 32 个标准特性位(Bit 0~31),Bit 32~63 保留给厂商自定义。下表列出最常用的特性位定义:
| Bit 位置 | 特性名称 | 置位条件 |
|---|---|---|
| Bit 0 | BIOS Characteristics Not Supported | 必须为 0(表示支持本字段) |
| Bit 1 | ISA is supported | 系统支持 ISA 总线 |
| Bit 2 | MCA is supported | 支持微通道架构 |
| Bit 3 | EISA is supported | 支持 EISA 总线 |
| Bit 4 | PCI is supported | 支持 PCI 总线(现代系统必须置位) |
| Bit 5 | PC Card (PCMCIA) is supported | 支持 PC 卡 |
| Bit 6 | Plug and Play is supported | 支持即插即用 |
| Bit 7 | APM is supported | 支持高级电源管理 |
| Bit 8 | BIOS is upgradeable (Flash) | BIOS 可闪存升级 |
| Bit 9 | BIOS shadowing is allowed | 允许 BIOS 影子内存 |
| Bit 10 | VL-VESA is supported | 支持 VESA 局部总线 |
| Bit 11 | ESCD support is available | 支持 ESCD |
| Bit 12 | Boot from CD is supported | 支持 CD-ROM 启动 |
| Bit 13 | Selectable Boot is supported | 支持可选择的启动设备 |
| Bit 14 | BIOS ROM is socketed | BIOS ROM 为插槽式 |
| Bit 15 | Boot from PC Card (PCMCIA) is supported | 支持从 PC 卡启动 |
| Bit 16 | EDD (Enhanced Disk Drive) is supported | 支持增强型磁盘驱动器规范 |
| Bit 17 | Int 13h - Japanese Floppy for NEC 9800 | 支持 NEC 9800 软盘 |
| Bit 18 | Int 13h - Japanese Floppy for Toshiba | 支持东芝软盘 |
| Bit 19 | Int 13h - 5.25"/360 KB Floppy | 支持 5.25 英寸 360KB 软盘 |
| Bit 20 | Int 13h - 5.25"/1.2 MB Floppy | 支持 5.25 英寸 1.2MB 软盘 |
| Bit 21 | Int 13h - 3.5"/720 KB Floppy | 支持 3.5 英寸 720KB 软盘 |
| Bit 22 | Int 13h - 3.5"/2.88 MB Floppy | 支持 3.5 英寸 2.88MB 软盘 |
| Bit 23 | Int 13h - 5.25"/2.88 MB Floppy | 支持 5.25 英寸 2.88MB 软盘 |
| Bit 24 | Int 13h - 3.5"/1.44 MB Floppy | 支持 3.5 英寸 1.44MB 软盘 |
| Bit 25 | Int 13h - 5.25"/1.44 MB Floppy | 支持 5.25 英寸 1.44MB 软盘 |
| Bit 26 | Int 13h - 3.5"/1.2 MB Floppy | 支持 3.5 英寸 1.2MB 软盘 |
| Bit 27 | Int 13h - 3.5"/720 KB Floppy | 支持 3.5 英寸 720KB 软盘 |
| Bit 28 | Int 13h - 3.5"/360 KB Floppy | 支持 3.5 英寸 360KB 软盘 |
| Bit 29 | Int 13h - 3.5"/2.88 MB Floppy | 支持 3.5 英寸 2.88MB 软盘 |
| Bit 30 | Int 13h - 5.25"/360 KB Floppy | 支持 5.25 英寸 360KB 软盘 |
| Bit 31 | Int 13h - 5.25"/1.2 MB Floppy | 支持 5.25 英寸 1.2MB 软盘 |
填充原则: 对于现代 x86_64 系统,至少应置位 Bit 4(PCI)、Bit 8(Flash 可升级)、Bit 12(CD 启动)、Bit 13(可选启动)。Bit 0 必须为 0。软盘相关的 Bit 17~31 在无软盘控制器时应全部清零。
3.3 填充案例:基于 EDK II 的 UEFI 固件
以下是一个基于 EDK II 框架的 Type 0 结构填充代码片段,展示如何正确设置上述四个字段:
// 定义字符串表索引
#define STR_INDEX_VENDOR 1
#define STR_INDEX_BIOS_VERSION 2
#define STR_INDEX_RELEASE_DATE 3
// 字符串表(位于结构体末尾)
// String 1: "Insyde Software Corp.\0"
// String 2: "5.23.01\0"
// String 3: "03/15/2025\0"
SMBIOS_TABLE_TYPE0 BiosInfo = {
.Type = 0x00,
.Length = 0x18,
.Handle = 0x0000,
.Vendor = STR_INDEX_VENDOR,
.BiosVersion = STR_INDEX_BIOS_VERSION,
.BiosSegment = 0xF000,
.BiosReleaseDate = STR_INDEX_RELEASE_DATE,
.BiosRomSize = 0x00, // 由固件自动计算
.BiosCharacteristics = {
// Bit 4: PCI supported
// Bit 8: Flash upgradeable
// Bit 12: Boot from CD
// Bit 13: Selectable boot
// Bit 16: EDD supported
// Bit 31: UEFI specification supported (扩展字节)
0x00010010, // 低32位
0x00000000 // 高32位
},
.BiosCharacteristicsExtensionByte1 = 0x00,
.BiosCharacteristicsExtensionByte2 = 0x08, // Bit 3: UEFI supported
.SystemBiosMajorRelease = 5,
.SystemBiosMinorRelease = 23,
.EmbeddedControllerFirmwareMajorRelease = 0xFF, // 无 EC
.EmbeddedControllerFirmwareMinorRelease = 0xFF
};
调试技巧: 在 UEFI Shell 下使用
smbiosview 命令可以实时查看 Type 0 结构的原始字节和解析结果。如果发现 Vendor 或 Version 显示为乱码,请检查字符串索引值是否从 1 开始计数,以及字符串是否以 null 正确终止。
3.4 BIOS Characteristics 位图结构示意
下图展示了 64 位 BIOS Characteristics 位图的布局,以及现代 UEFI 系统典型置位情况:
3.5 填充流程与调试检查清单
在实际固件开发中,填充 Type 0 结构应遵循以下步骤:
- 确定字符串内容: 根据固件