BIOS开发笔记 16 – Windows 是如何获取 BIOS 启动时间的 ?

 

Windows 的任务管理器下,在“启动应用”选项卡的右上角,有一个“上次 BIOS 所用时间”的信息项,它展示的是 BIOS 的启动时间,它是如何实现的呢?

简单来说,UEFI 代码在启动的各阶段测量时间,并在最后将所测量的数据写至一个专用的ACPI Table,操作系统便可取得启动时间。下面对此作详细的讨论。

 

1. FPDT 简介

FPDT(Firmware Performance Data Table)是一个顶层的ACPI表,其签名为‘FPDT’。它的主要作用不是直接存储性能数据,而是作为一个容器,指向包含实际性能数据的其他记录或表格 。

FPDT内部包含一个或多个“性能记录”(Performance Records)。对于正常的冷启动时间测量,其中最核心的记录是“固件基本启动性能表指针记录”(Firmware Basic Boot Performance Table Pointer Record)。  

这个指针记录的结构非常简单,主要包含两个关键信息:一个类型标识符,用于指明这是一个指向基本启动性能表的指针;以及一个64位的物理内存地址,该地址指向内存中实际存储启动时间戳的“固件基本启动性能表”(Firmware Basic Boot Performance Table, FBPT)。正是通过这种间接寻址的方式,操作系统才能从FPDT找到最终的数据源。  

以下是根据ACPI规范定义的FPDT及其指针记录的结构。

1.1. 固件性能数据表(FPDT)结构

此表是操作系统在ACPI表中寻找性能数据的起点。它包含标准的ACPI表头,操作系统通过解析表头来验证表的有效性并确认其为FPDT。

字段
字节长度
字节偏移
描述
表头
 
 
 
Signature
4
0
'FPDT',固件性能数据表的签名。
Length
4
4
整个FPDT表的长度,以字节为单位。
Revision
1
8
结构的版本号。对于符合规范的FPDT,此值为1。
Checksum
1
9
校验和。整个表(包括此字段)的所有字节之和必须为0。
OEMID
6
10
标识OEM厂商的字符串。
OEM Table ID
8
16
OEM用以标识此特定数据表的字符串。
OEM Revision
4
24
OEM提供的版本号。
Creator ID
4
28
创建此表的工具的供应商ID。
Creator Revision
4
32
创建此表的工具的版本号。
Performance Records
-
36
一个或多个FPDT性能记录的集合。

1.2. 基本启动性能表指针记录结构

此记录位于FPDT的“Performance Records”部分,它提供了通往实际数据存储地点的关键链接。

字段
字节长度
字节偏移
描述
Performance Record Type
2
0
值为0,表示这是一个“固件基本启动性能表指针记录”。
Record Length
1
2
值为16,表示此性能记录的长度,以字节为单位。
Revision
1
3
值为1,表示此性能记录的版本。
Reserved
4
4
保留字段。
FBPT Pointer
8
8
64位的处理器相对物理地址,指向固件基本启动性能表(FBPT)。

通过解析这两个表结构,操作系统便能成功地从FPDT中提取出FBPT的物理地址。

2. 固件基本启动性能表(FBPT)

沿着FPDT提供的指针,操作系统最终找到了存储着精确启动时间戳的核心数据结构——固件基本启动性能表(FBPT)。它内部的记录直接揭示了固件在启动过程中的关键时间节点。

2.1. FBPT及其数据记录

FBPT是位于FPDT指针记录所指向的物理地址处的一个ACPI表,其签名为‘FBPT’ 。与FPDT类似,FBPT也是一个记录容器。在其内部,唯一且最重要的记录是“固件基本启动性能数据记录”(Firmware Basic Boot Performance Data Record)。这个记录包含了由UEFI固件在启动过程中捕获的一系列高精度时间戳。

表 2.1:基本启动性能数据记录结构

这张表是本报告中最为核心的证据,它精确定义了用于计算“上次BIOS所用时间”的原始数据字段。

字段
字节长度
字节偏移
描述
Performance Record Type
2
0
值为2,表示这是一个“固件基本启动性能数据记录”。
Record Length
1
2
值为48,表示此记录的长度,以字节为单位。
Revision
1
3
值为2,表示此记录的版本。
Reserved
4
4
保留字段。
Reset End
8
8
固件执行开始时的计时器值。
OS Loader LoadImage Start
8
16
加载OS引导加载程序镜像前的计时器值。
OS Loader StartImage Start
8
24
启动OS引导加载程序镜像前的计时器值。
ExitBootServices Entry
8
32
进入ExitBootServices函数时的计时器值。
ExitBootServices Exit
8
40
退出ExitBootServices函数时的计时器值。

OS Loader LoadImage Start和OS Loader StartImage start哪个作为Windows任务管理器中的bios启动时间呢?

前者标志着开始加载 Windows 内核加载器 (winload.efi);后者标志着开始执行winload.efi,即固件将控制权正式移交给 Windows OS Loader 的时刻,将作为UEFI代码执行的最后交接点,它便是UEFI阶段的执行时间。

知晓原理之后,便可以使用工具读取FPDT ACPI Table 验证,下面是使用HE读取的结果。

 

 

版权声明:
作者:bin
链接:https://ay123.net/mystudy/1876/
来源:爱影博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
BIOS开发笔记 16 – Windows 是如何获取 BIOS 启动时间的 ?
  Windows 的任务管理器下,在“启动应用”选项卡的右上角,有一个“上次 BIOS 所用时间”的信息项,它展示的是 BIOS 的启动时间,它是如何实现的呢? 简单来说,……
<<上一篇
下一篇>>
文章目录
关闭
目 录