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 系统典型置位情况:

BIOS Characteristics 64 位位图结构(典型 UEFI 系统) Bit 0~31 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Bit 32~63 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 置位(支持) 清零(不支持) Bit 0 必须为 0 厂商自定义位 典型 UEFI 系统置位示例: Bit 4 (PCI) = 1, Bit 8 (Flash) = 1, Bit 12 (CD Boot) = 1, Bit 13 (Selectable Boot) = 1, Bit 16 (EDD) = 1 Bit 31 (UEFI) 通过扩展字节 Byte2 Bit3 表示,不在主位图中 所有软盘相关位 (Bit 17~31) 在无 FDC 系统中应全部清零

3.5 填充流程与调试检查清单

在实际固件开发中,填充 Type 0 结构应遵循以下步骤:

  1. 确定字符串内容: 根据固件