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。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Performance Records |
|
|
|
1.2. 基本启动性能表指针记录结构
此记录位于FPDT的“Performance Records”部分,它提供了通往实际数据存储地点的关键链接。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
通过解析这两个表结构,操作系统便能成功地从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所用时间”的原始数据字段。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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/
来源:爱影博客
文章版权归作者所有,未经允许请勿转载。

共有 0 条评论