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

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

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

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

一、上电时序

上电时序,也叫做Power-up Sequence,是指电源时序关系。它牵扯到诸多计算机部件,在正式开始时间之旅之前,我们来介绍一下所有参与的小伙伴们。
在这里插入图片描述

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.时间开始

我们通过一个古老的例子来了解一下开机的整个过程:
在这里插入图片描述

  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复位。

时序图如下:

在这里插入图片描述
在CPU复位后,是不是要立刻跳到reset vector开始执行BIOS程序了呢?还没有,opcode、on die rom会在这个阶段执行,TXT、boot guard等安全保障措施也在这里运行。

二、第一条指令

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

参考Intel提供的软件开发者手册《64-ia-32-architectures-software-developer-manual》其中一节,讲述第一条指令的位置。
在这里插入图片描述
从上面文档内容,我们得知

  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
在这里插入图片描述
本文主要来源:
按下电源键后发生了什么?电脑是如何优雅地开机的?
《Intel® 64 and IA-32 Architectures Software Developer’s Manual》
《UEFI原理与编程》

整个上电时序Power Sequencing的详细过程: 1.在未插上ATX电源之前,由主板上的电池产生VBAT电压和CMOS跳线上的RTCRST#来供给南桥,RCTRST#用来复位南 桥内部的逻辑电路,因此我们应首先在未插上ATX电源之前量测电池是否有电,CMOS跳线上是否有2.5V-3V的电压。 2.检查晶振是否输出了32.768KHz的频率给南桥(在nFORCE芯片组的主板上,还要量测25MHz的晶振是否起振) 3.插上ATX电源之后,检查5VSB、3VSB、1.8VSB、1.5VSB、1.2VSB等待机电压是否正常的转换出来(5VSB和3VSB的 待机电压是每块主板上都必须要有的,其它待机电压则依据主板芯片组的不同而不同,具体请参照相关芯片组的 DATASHEET中的介绍) 4.检查RSMRST#信号是否为3.3V的高电平,RSMRST#信号是用来通知南桥5VSB和3VSB待机电压正常的信号,这个信号 如果为低,则南桥收到错误的信息,认为相应的待机电压没有OK,所以不会进行下一步的上电动作。RSMRST#可以在I/O 、集成网卡等元件上量测得到,除了量测RSMRST#信号的电压外,还要量测RSMRST#信号对地阻值,如果RSMRST#信号处 于短路状态也是不行的,实际维修中,多发的故障是I/O或网卡不良引起RMSRST#信号不正常。 5.检查南桥是否发出了SUSCLK这个32KHz的频率。 6.短接主板上的电源开关,发出一个PWBTN#信号给I/O,I/O收到此信号后,经过内部逻辑处理发出一个PWBTIN#给 到南桥。 7.南桥收到PWBTIN#信号后,发出SLP_S3#给I/O,I/O接到此信号后经过内部的逻辑处理发出PSON#信号给ATX电源, ATX电源接到低电平的PSON#信号后,开始工作,发出各路基本电压给主板上的各个元件,完成上电过程。
### 回答1: 这个错误提示的意思是:当前平台不支持这个.whl文件。通常情况下,这个错误会在你尝试安装一个Python模块时出现,可能是因为你下载了错误的模块或者不兼容当前的操作系统。建议你仔细检查模块的版本和你的操作系统,确保它们匹配,并且下载正确的模块。 ### 回答2: "whl是不支持的平台上的轮子"是一个Python语言中常见的错误提示消息,通常意味着您正在尝试安装一个安装包,但它不兼容您的操作系统或架构。一般情况下,这种错误提示消息通常出现在您使用pip安装Python包或模块时。 这个问题的一个可能原因是您正在尝试安装的包由于一些原因不被支持。有时候,包可能会因为更新而不再兼容到您的特定系统配置中。此外,这种错误可能还与Python模块和包的版本号有关,而这些版本为了保证向后兼容性而仍然支持旧的Python版本。 解决此问题的最常见方法是尝试升级您的Python版本,并且确保包和模块是与您的Python版本兼容的,然后重试安装。此外,您还可以通过手动下载和安装特定版本的包文件来解决此问题,而非使用pip自动下载和安装。如果这些步骤没有解决问题,您可能需要与包的开发者联系以获得支持和解决方法。 总之,"whl是不支持的平台上的轮子"是在Python编程中经常遇到的错误提示消息之一,实际意义为您需要检查您的系统配置和您要安装的包或模块的版本号是否兼容并且正确,以解决此问题。 ### 回答3: “whl不是此平台支持的轮子。”是Python包安装过程中的一种常见错误信息。该错误通常表示您下载的Python包不能被当前正在使用的操作系统和Python版本支持。通常,此错误是由以下原因之一引起的: 1. 您将Python包下载到错误的操作系统上,例如,您可能从Windows下载了Linux版本的Python包。 2. 您使用了与要安装Python包不兼容的Python版本,例如,您正在使用Python 2.x,但要安装的Python包只支持Python 3.x。 3. 您下载的Python包已经被损坏或不完整,这通常会导致无法将其正确安装。 要解决这个错误,您可以首先检查要安装的Python包是否与您当前使用的操作系统和Python版本兼容。如果您发现原因是下载了不兼容的版本,您应该尝试下载一个兼容的版本。如果您发现Python包可能已经被损坏,请重新下载。 您还可以尝试使用其他工具(例如pip)来安装Python包,以避免手动下载和安装的问题。使用常用的Python包管理工具,可以更轻松地管理和更新您的Python包。如果仍然无法解决问题,请访问相关的Python社区或寻求技术支持的帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值