UEFI BIOS —— 开机上电阶段分析

当我们按下电源键后,CPU就开始reset vecto执行BIOS程序了吗?

  1. 按下电源键,在CPU执行代码之前,由上电时序工作。
  2. 据了解服务器或者部分台式机的上电时序都是由cpld实现,笔电则由EC实现。

以X86平台为例,转载一位大佬写的内容(上电时序)。
按下电源键后发生了什么?电脑是如何优雅地开机的?

一、上电时序

上电时序,也叫做Power-up Sequence,是指电源时序关系。它牵扯到诸多计算机部件,在正式开始时间之旅之前,我们来介绍一下所有参与的小伙伴们。
UEFI BIOS —— 开机上电阶段分析_第1张图片

1.电源

  • ATX电源提供+12V、-12V、+5V、-5V、+3V和+5VSB等六种电压。也就是我们图上的两个白色的电源接入口。主板其他的不同电压是主板上的变压线路转换过来的,他们包括+3VSB、+1.5VSB、1.8VDual、2.5VDual、3VDual、VCore、VTDDR等等很多。
  • +12V主要是给CPU内核供电,它可以单独给PCIe设备供电,包括显卡等等。
  • +5V应用最广,给USB等等外设供电。
  • +5VSB等各种带SB的电压,是提供Stand By的供电,即在S3 Sleep时提供电力,保障唤醒和刷新。

主板右边中间那个纽扣电池,它叫做RTC电源,永不掉电。除非电池没电并且没接任何外部电源。 RTC用以保持机器内部时钟的运转和保证CMOS配置信息在断电的情况下不丢失。

2.时钟

  • 电脑中的CPU,AGP、PCI插槽、SATA、USB端口和PS/2端口等在通信速度上有很大差异,所以需要提供不同的时钟频率。
  • 由ck410、ck505和iCLK等芯片将原先散布在不同地方的晶振和分频电路整合在一起,为CPU、SATA、PCI、USB等等设备提供基础频率。

3.电源时序控制芯片/电路

主板对于上电的要求是很严格的,各种上电的必备 条件都要有着先后的顺序,一项条件满足后才可以转到下一步,如果其中的某一个环节出现了故障,则整个上电过程不能继续下去。谁来控制和协调整个时序过程呢?不同的主板、芯片组、代际之间都有不同的方案,在笔记本上过去经常采用EC的方案、台式机则很多用SIO或者定制芯片。现在很多电源时序控制被整合进了ME中,在面向嵌入式设备的Atom系列主板上则越来越多的引入了在手机等设备上常用的PMIC。

4.时间开始

我们通过一个古老的例子来了解一下开机的整个过程:
UEFI BIOS —— 开机上电阶段分析_第2张图片

  1. 在G3(未接电源)情况下,RTC电源提供RTC_RST#和VCC_RTC电源给南桥。

  2. 插入电源或者电池。系统进入G2,S5的状态。EC检查电源的可靠性,并发送PM_RSMRST#通知南桥各种SB电压已经准备完毕。南桥复位,部分功能SB功能激活,进入待机状态。

  3. 用户按下电源键,时间开始。

  4. EC收到PWRSW#信号,通过PM_PWRBTN#通知南桥。南桥收到PM_PWRBTN#信号后依次拉高SLP_S5#,SLP_S4#,SLP_S3#信号给EC。

  5. EC发出PCON#给ATX电源。

  6. ATX电源接到低电平的PSON#信号后,开始工作,发出各路基本电压给主板上的各个元件。

  7. 基本电压变换的其他电压也被转换出来。

  8. 电源发出PWROK#给EC,EC转交给南桥和北桥(有的话)

  9. VRM和CPU通讯,根据VID送出Vcore

  10. VRM发生VRMPWRGD#给南桥,表示核心电压OK。

  11. 南桥发送PLT_RST#给北桥。

  12. 南桥发送PWRGOOD#给CPU。

  13. 北桥在收到PLT_RST#信号后,1秒钟后发生CPU_RST#,让CPU复位。

时序图如下:

UEFI BIOS —— 开机上电阶段分析_第3张图片
在CPU复位后,是不是要立刻跳到reset vector开始执行BIOS程序了呢?还没有,opcode、on die rom会在这个阶段执行,TXT、boot guard等安全保障措施也在这里运行。

二、第一条指令

CPU复位之后的第一条指令在哪?

参考Intel提供的软件开发者手册《64-ia-32-architectures-software-developer-manual》其中一节,讲述第一条指令的位置。
UEFI BIOS —— 开机上电阶段分析_第4张图片
从上面文档内容,我们得知

  1. 第一条指令位置比最高物理地址低16个字节, 也就是 0xFFFFFFF0 ( 4G - 16字节 )这个位置 。
  2. CPU初始应该是实模式,0xFFFFFFF0 地址超出处理器实模式 1M 字节的可寻址范围。是因为访问物理内存的方法都是段寄存器CS中隐藏部分的段基址与EIP相加得到的地址。隐藏寄存器中的段基址被初始化为FFFF0000h,直接和EIP(FFF0h)相加则得到了第一条指令地址0xFFFFFFF0。
  3. 所以说在EPROM代码初始化完成之前,为了确保CS寄存器中的基址不变,代码必须不包含远跳转或远调用或允许中断发生。

知晓了CPU第一条指令,那么后续指令在哪?要怎么读取和执行呢?

注:以下BIOS 指的是UEFI BIOS或者UEFI BIOS Flash

首先了解一个知识,后续的指令都在BIOS里面存储,而现在大部分电脑或服务器的BIOS都存放在一块NOR Flash中,这块Flash通过SPI接口和南桥PCH相连。

  1. NOR Flash是字节寻址,意味着它可以 XIP ( eXecute in place),简单理解就是原地执行代码,不需要加载load到某块内存中使用。
  2. CPU发送此地址(0xFFFFFFF0)到北桥上解码,如果该地址没有被北桥上的设备占用,那么就会通过DMI通道发送到南桥上的设备进行解码,此地址会被南桥的SPI控制器接收,SPI控制器负责翻译地址(Address Decode),最后翻译成SPI指令,CPU就从NOR Flash中得到相应指令和数据。

整个过程如下:

  1. CPU 上电之后,内核Core需要Reset Vector的代码,它改到地址放到地址总线上;
  2. Uncore 的 DMI 控制器缺省 decode 这块空间,它把该请求通过DMI总线发送给南桥;
  3. 南桥的 SPI 控制器缺省 decode 这块空间,它用 SPI 总线问 SPI Flash芯片要该内容;
  4. SPI 芯片响应请求,返回内容;
  5. SPI 控制器响应请求,当二传手返回内容;
  6. DMI 控制器响应请求,当三传手返回内容;
  7. CPU内核收到指令,开始解码执行;

这样一个64B的信息有了,直到运行下一个64B,再循环往复。可以看出,并没有人加载整个BIOS,而是一点点通过地址decode慢慢运行。

三、UEFI阶段

CPU随后开始执行reset vector的代码了,这就进入了我们熟悉的UEFI的世界。这里简单回顾一下:

UEFI主要有三个目的:

  1. 初始化硬件
  2. 安全启动操作系系统
  3. 为操作系统提供统一的硬件抽象

UEFI流程如下:

SEC -> PEI -> DXE -> BDS -> TSL -> RT -> AL
UEFI BIOS —— 开机上电阶段分析_第5张图片
本文主要来源:
按下电源键后发生了什么?电脑是如何优雅地开机的?
《Intel® 64 and IA-32 Architectures Software Developer’s Manual》
《UEFI原理与编程》

你可能感兴趣的:(UEFI,单片机,嵌入式硬件)