先上问题。
- 电脑上电后,如何判断UEFI当前运行在哪一个阶段?
- 如果发生了错误,系统能告诉工程师发生了何种错误吗?
答案是肯定的,这可以通过状态码 Status code来解决。
POST是什么?
在了解Status code之前,先说说什么是POST。
上电自检(Power On Self Test, POST)是BIOS/UEFI 固件领域的一个行业术语。它表示系统在上电后(接上AC电源,按下PowerButton),BIOS/UEFI对系统进行硬件设备检测和资源初始化的过程。
在POST阶段,BIOS/UEFI通常会检测当前系统有哪些设备,比如内存,硬盘,显示器,散热器,键/鼠等等,并对它们进行初始化,分配内存资源或IO端口。如果BIOS/UEFI检测到系统中某些组件不存在,如内存,硬盘,风扇等,则会发出POST Error code,并将其通过数码管之类的显示设备显示出来。
如果是发生严重错误,则会通过蜂鸣器发出警告声。不同严重错误会对应不同的声音类型,比如两长三短可表示视频显卡未检测到,三短一长可表示内存未检测到,两短可表示一般错误发生。具体哪种类型的声音对应哪种严重错误,得根据厂商的Spec规范来定义。
当然,除了警告,错误,BIOS/UEFI还定义了一些POST Status code。我们知道,POST过程包含很多阶段,用时通常为十几秒到几十秒之间,具体得看系统的配置情况。总的来说,系统的配置越高,POST用时也越长。BIOS/UEFI工程师通过这些POST Status code可以知道当前POST过程具体执行到哪一个阶段了,而这对于BIOS/UEFI程序调试具有非常大的帮助。
Boot Flow
那么,BIOS/UEFI的启动流程是怎么样的呢?
对于Intel平台,BIOS/UEFI的启动流程遵循PI规范。PI规范规定系统固件的启动顺序如下图所示[1]:

来源:PI Spec 1.7
- Security (SEC) : 安全相关的底层初始化,包括调用CPU的Cache作为临时RAM (Cache As RAM) ,初始化栈相关。
- Pre-EFI Initialization (PEI) : 内存初始化。
- Driver Execution Environment (DXE) : 大部分硬件初始化都在这个阶段。
- Boot Device Selection (BDS) : 启动设备选择。
- TSL\RT\AL
对于BIOS/UEFI而言,主要就是负责前4个阶段的工作,后面的部分则是OS Loader和OS负责。
Status code
A status code is a data value used to indicate progress during [the boot phase](https://www.zhihu.com/search?q=the boot phase&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"answer"%2C"sourceId"%3A3431777144}).
状态码(Status Code) 是一种用来表示启动阶段的数据值(两个字节)。对于BIOS/UEFI工程师来说,我们只关注BIOS/UEFI启动过程的常见阶段。因此,我们通常其实使用的是状态码的一个子集——Checkpoint。
Checkpoint
Checkpoint 数据值通常是通过 80h I/O(什么是80h I/O ?)来输出的。Checkpoint 标识了当前系统正在执行的任务,比如正在初始化内存,还是在初始化键盘之类的。Checkpoint 对BIOS/UEFI的早期启动阶段调试非常有帮助。
那我们如何得知系统此时的Checkpoints呢?鉴于目前市面上大部分的BIOS都是采用AMI的Aptio V。对此,AMI早期提供了一种PCI checkpoint card,也常常被叫做POST CARD。它可以通过LED灯显示80h I/O口的值。

来源[2]
目前,新的升级版是基于USB的AMI Debug Rx。它可以通过USB口接入系统,调试,查看Checkpoint非常方便。

来源 [2]
Checkpoint 范围
知道了怎么获取,显示 Checkpoints,我们还得知道这些Checkpoint具体代表启动过程的什么阶段。对此,AMI给出了Checkpoint的阶段范围,我们可以参考下面这张表。

来源[2]
可知,Checkpoint 的范围是两个字节,共16位,标识的范围为:0x00~0xFF。各个范围都对应一个Boot Phase。
举个栗子,如果我们发现此时系统上的Checkpoint是 0x56,那么根据上表,便可得知此时系统处于PEI阶段,且发生了[PEI errors](https://www.zhihu.com/search?q=PEI errors&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra={"sourceType"%3A"answer"%2C"sourceId"%3A3431777144})。
那有人可能要问了,0x56具体标识什么错误呢?关于每个范围内具体的Checkpoint标识什么,则需要去查看某个阶段的具体Checkpoint。这里的0x56则表示系统配置了无效的CPU类型或者速度。

来源[2]
关于其它详细的Checkpoint,可以参考AMI的公开文文档:[2]
<完>
文章评论