一、Legacy BIOS 和 UEFI BIOS

萌新学习UEFI,如果有错误,希望大佬能够私聊或留言指正!

第一章 UEFI的世界

  BIOS(Basic Input and Output System, 基本输入输出系统),在个人计算机诞生的初期,有众多公司厂商为了占有更多BIOS的市场而互相厮杀,活下来的,就能将自己的BIOS技术传下去,但更多的是消失在了这场残酷的战争中。
  BIOS的发展大致可以分为两个阶段:Legacy BIOSUEFI BIOS时期。

1.1 Legacy BIOS

1.1.1 Legacy BIOS的启动过程

  本文在讲述Legacy BIOS时,以Award 的 BIOS 为例。如图,下面展示了一个2Mb(256KB)的Award BIOS的镜像结构,这是BIOS生成的文件存储在Flash ROM中的文件结构。

PS:不同容量的Flash ROM所存储的BIOS文件结构也不相同,比如笔者所在的公司的BIOS,分16M和24M的,这两者其实文件结构是不同的。

2Mb Award BIOS 镜像图
  图中所示的各个模块的功能简介如下:

  • BootBlock: 负责初始化硬件并加载其他模块,同时这个模块也是负责刷写BIOS的支撑模块,在刷写BIOS时,该模块并不会被更新。
  • ESCD、DMI/P6u:用来存储BIOS配置的数据区,例如系统硬件的配置信息,Setup中选项的value等。
  • BootExt:主要用来解压模块到指定的内存区。
  • MainBlock:主体模块,由很多子模块构成,实现各类BIOS规范,例如APM规范、VESA规范、硬盘访问规范等,并对外提供BIOS的访问接口。
      
      存放在ROM中的BIOS文件,它最终也是要加载到内存中运行的,由于当时厂商过于的“百花齐放”,他们加载的流程也并不相同,这里还是以这个2Mb的Award BIOS为例,讲解BIOS文件的加载流程。
1.1.1.1 BootROM(从ROM中启动)阶段

  主板在开机启动或者重启的时候,处理器会跳到系统BIOS并开始执行代码,这个地址位于可寻址的内存的顶部。(感觉有点晦涩和抽象?继续往下看!)
  一般来说,BIOS ROM会映射到内存可寻址范围的高端地址,例如咱的例子—2Mb 的 Award BIOS,它占用的内存是FFFC 0000h ~ FFFFFFFFh。主板通常会对系统BIOS进行双重映射,使得访问F000:FFF0h实际上就是访问物理地址FFFFFFF0h。

相关内容解释:
1.为什么2Mb的Award BIOS占用的内存是FFFC 0000h呢?(注意是2Mb不是2MB!)
答:2Mb = 1/4MB = 256KB = 256 * 1024b = 262144b = 0x4 0000
0x40000 + 0xFFFC 0000 = 1 0000 0000 (懂了吧,从0xFFFC 0000开始,到1 0000 0000(0xFFFF FFFF+1)之间正好差0x4 0000,这也对应了“可寻址的内存的顶部”)亦如下图所示:
在这里插入图片描述

2. F000:FFF0是什么?
答:在早期,其实它是PC上电后,CPU执行的第一条指令。例如80286,CS (段寄存器): F000, IP(EIP偏移) : FFF0,这个计算方式如下图,F000 左移4位(或是x16) 得到 F 0000, F 0000 + FFF0 = F FFF0,即0xF FFF0,0xF FFF0 ~ 0xF FFFF一共有16个地址,x86架构中,实模式下的地址映射,物理地址和内存中的一个字节一一对应,因此,0xF FFF0 ~ 0xF FFFF中就对应着16个字节,这16个字节存储的是BIOS的启动程序,即计算机在上电时执行的第一段代码。
但是,在现在,PC上电后,硬件会把EPROM(即烧录BIOS的那个芯片)里的内容映射到2个地方,一个是0xFFFFF(1MB)往下扩展的地方,另一个是0xFFFF FFFF(4GB)往下扩展的地方。因此,与早期PC不同,系统复位时,CS寄存器设置成F000h,根据之前的内容,我们知道CS寄存器设置成F000h,那么它的物理地址应该是F 0000h(左移4位嘛,先不考虑EIP),但是它的shadow register的Base却设置成FFFF 0000h,Intel有意识的将高12位也全部置1,因为只有这样,才能在CPU上电后,直接跑到4GB那么高的地址上去执行。
在这里插入图片描述
                    CS:IP计算方式图

3. 可能有人会问,这个时候内存不是还没有被初始化么?
答:是的,没错,所以这个时候即便你的内存<4GB也没有关系,因为其实并没有使用到内存。在计算机启动的过程中,确实有一个阶段是由BIOS来进行内存的初始化,在这个过程中,BIOS会执行一系列的步骤,包括检测和初始化系统的硬件,其中当然也包括内存。但是!此阶段时的内存并未初始化,所以不会使用到内存。
☆☆《硬件把ROM中的内容映射到4GB以下以及1MB以下》— —这句话我个人是这么理解的:就是它把4GB处以下以及1MB处以下的 <地址空间> 分配给了ROM,当我们执行访问4GB以下或者1MB以下的那段相关的代码的时候,可以把它当成在访问ROM的映射。例如,当CPU执行第一条位于0xFFFF FFF0的指令的时候,就间接等同于访问的ROM。因为ROM中的内容被映射到4GB以下的高位了。
更详细的与CPU上电后的相关内容,请看这里

  总的来说,BootROM阶段能做的事很有限(有点像UEFI下的PEI阶段),主要是做一些早期的硬件初始化、判断系统是否从S3(待机)返回等工作。

1.1.1.2 Memory Sizing(内存处理)阶段

  这个阶段,主要进行内存的初始化和对其他模块的校验和验证。
  内存初始化一般会分成4步进行—设置内存时序、检测内存状态、设置内存大小和设置内存的其他特性。初始化完成之后,程序就可以使用内存堆栈了,代码也就不用在ROM上执行了。
  这个阶段会对MainBlock进行解压,主要使用的就是BootExt模块中的函数,一边解压一遍进行校验和验证。这个阶段也会对CMOS(一般用来存储BIOS设置选项的非易失性存储芯片)进行校验和验证。

1.1.1.3 BootBlock POST(启动模块处理)阶段

  这一阶段的主要目的,是在BIOS镜像因为操作失误或者病毒攻击被破坏后,在这个阶段可以让终端用户覆写ROM中的BIOS文件。(反正日后不会有这个问题,就不细说了)

1.1.1.4 MainBios POST (主模块处理)阶段

  这是BIOS启动流程中最主要的部分(它都叫主模块处理了!),在此阶段,用户通过启动过程中的输出在Debug Card上的信息(比如B站那些维修佬经常说的,卡B2了!多半核心挂了或者显存挂了),了解当前的启动情况。这些数字用来表示当前所处的启动阶段。
  如果在启动过程中没有出现任何问题,那么BIOS会进行一个长的跳转,调用终端19h,加载操作系统。
  至此,老BIOS就完成了它的使命。

1.1.2 Lagecy BIOS的不足

  Legacy BIOS主要运行在实模式下,可寻址空间限制在1MB以内,为了在有限的空间内做更多的事情,Legacy BIOS会尽可能的利用每一段内存空间。那为了保证向后的兼容性,为大量的遗留老硬件提供了相应的驱动程序,这占用了非常大的代码空间,何况当时并没有统一的BIOS规范,各家做的百花齐放,程序员可自由发挥的空间很大,那随着人员的更替,代码维护的工程量就变得非常大,开发的效率也变得很低。(这要跳槽的话属实没法跳啊,跳过去重学一遍别人的架构)

2.1 UEFI BIOS

  随着时代的变迁,UEFI(Unified Extensible Firmware Interface,统一可扩展固件接口)重磅登场,它定义了连接操作系统和硬件体系之间的标准接口,也针对Legacy BIOS的缺点进行了全面的设计,以适应飞速发展的计算机行业。

2.1.1 UEFI BIOS 名词概述

在学习UEFI之前,我们必须要了解一些基本概念,如下:

  • Boot Manager:操作系统或UEFI Shell等可以在任何符合规范的设备中加载,而决定加载顺序的就是Boot Manager,Boot Manager通过全局的NVRAM变量来管理加载,可以对它进行配置,以增加启动选项或者从启动列表中删除无效的选项。
  • UEFI Images:UEFI Image(UEFI镜像)是UEFI规范定义的包含可执行代码的二进制程序文件。它分为UEFI应用程序和UEFI驱动。
  • UEFI Services:UEFI Services(UEFI服务)是平台调用接口的集合,允许UEFI程序和操作系统调用,这些接口是由UEFI应用程序、驱动和UEFI OS Loader提供,主要涉及启动服务(Boot Services,BS)和运行时服务(Runtime Services,RS)。
  • UEFI Protocol:UEFI Protocol本质上是一种数据结构(个人感觉类似于面向对象,给你封装好的一个个函数,然后给你提供一个函数接口让你去调用),它会给你提供一个全局唯一标识符GUID(Global Unique Identification),你可以通过GUID去找到对应的接口数据结构,以及其提供的服务(类似函数)。
  • UEFI System Table:要写UEFI应用程序和UEFI驱动,那必须使用到UEFI Protocol,那在程序中怎么定位到这些Protocol呢?就是通过UEFI System Table来实现的。所有UEFI镜像都会接到一个指向UEFI System Table的指针,通过这个系统表可以访问固件提供的UEFI Protocol。

2.1.2 UEFI BIOS 的优点

  相较于Legacy BIOS,UEFI BIOS有如下几点优势:

  • 开发效率高:UEFI采用C、Python加少量汇编语言的混合模式编写,以C语言为主,它屏蔽了大量的底层细节,为程序员提供了非常统一的调用接口,能很方便的在多种CPU架构间编写代码,这意味这很多代码可以重复使用,极大地提高了编程效率。
  • 突破了ROM的容量限制:UEFI可以解析文件系统,可以将硬盘的某个区域变为自己的存储空间,这不但保证了充足的容量,而且可以直接执行一些常用的程序。
  • 可拓展性好:这就不用说了,因为Protocol,C语言中引入类似面向对象的概念,自然拓展性好。
  • 系统性能高:Legacy BIOS 运行于16位实模式下,而UEFI是直接运行在保护模式下的,可以充分利用CPU和内存,UEFI提供了一步操作机制,这类似于操作系统下的多进程模式,可以充分提高CPU的利用率,来减少等待时间。
  • 安全性高:UEFI建立了完整的可信链基址,主板出厂时,内置了一些可靠的公钥,当安全启动(secure boot)功能打开时,UEFI在执行应用程序和驱动前,会检测应用程序和驱动的证书,只有证书被内置的公钥认证通过,它才能够被执行。这个安全机制极大地提高了操作系统启动过程时的安全性,能有效阻止恶意软件。
  • 易用性好:UEFI支持高分辨率的彩色显示,可以运行GUI界面,支持使用鼠标,使得开发人员可以构建非常有好的用户交互界面。

2.1.3 UEFI BIOS的启动过程☆☆☆

  与Legacy BIOS的百花齐放形成了鲜明的对比,UEFI BIOS的启动非常的标准,规范化。它一共经历7个阶段,如下图所示:
在这里插入图片描述
  这7个阶段分别是:SEC、PEI、DXE、BDS、TSL、RT、AL阶段。从我做BIOS的来看,一般来说,BIOS工程师最主要关注PEI、DXE、BDS这三个阶段。下面简单讲讲这几个阶段主要负责什么事。

1. Sec阶段

  Sec(Security)阶段是UEFI 启动的第一阶段,计算机上电启动后进入此阶段,这一阶段运行在内存初始化之前仅CPU的寄存器和CPU内部资源可以使用。一般来说,系统会使用临时RAM来进行代码的运行和数据的存取,常用的临时RAM为Cache
 Sec阶段的主要完成的任务如下:
1.处理系统上电或重启:当系统上电、重启或者运行过程出现异常信号导致重启时,将跳转到**Reset Vector(重启向量)**处开始运行。
2.创建临时内存:一般使用Cache作为临时内存,虽然程序还是在ROM上执行,但是可以依赖于栈的C语言函数,便于程序员开发。
3.提供安全信任链的根:Sec阶段是整个可信系统的根基,为了保证执行代码是可信的,通常会在这个阶段对PEI加载映像进行HASH校验。
4.传送系统参数给下一阶段(PEI):传递的信息包括平台的状态,BFV(Boot Fireware Volume,可启动固件)、临时RAM的地址和大小、栈的地址和大小。

2. PEI阶段

  在PEI(Pre-EFI Initialization)阶段。程序从ROM执行转向内存执行。这个阶段会对内存进行完全的初始化,它主要为后面的DXE阶段准备执行环境。在PEI阶段后期,也会对S3返回时间进行处理。

  从功能上来说,PEI可以分为PEI内核(PEI Foundation)和PEI Dispatcher。PEI内核负责PEI阶段的服务和流程;PEI模块派遣器则是按照系统中的PEI Module的依赖关系,依次执行PEI Module。PEI阶段操作执行流程如下:

  • 接收从SEC传递过来的参数,使用Cache作为内存
  • PEI模块派遣器执行循环,依次执行各PEI模块,包括CPU PEI Module、Platform相关的PEI Module、内存初始化PEI Module。
  • 检查计算机处于何种启动模式(Boot Model),如果检查发现计算机处于S3启动模式,那就执行S3返回流程,如果不是,则准备HOB(Hand-Off-Block)列表,进入DXE入口。
  • PEI内核(PEI Foundation)存在于BFV中,他在SEC阶段被验证过,以确定它是否遭到破坏。它会建立一个System Table,即PEI服务表(PEI Services Table),所有的PEI Module都可以访问它。
    PEI Module是一些可执行的二进制代码,封装了关于处理器、芯片组、设备或者平台相关的功能,并由PEI内核负责派遣,各个 PEI Module 之间的沟通,是通过PPI(PEIM to PEIM Interfaces)来实现的。以下为PPI的数据结构,它由一个GUID和一个指针组成。
// The data structure through which a PEIM describes available services to the PEI Foundation.
//
typedef struct {
  //
  // This field is a set of flags describing the characteristics of this imported table entry.
  // All flags are defined as EFI_PEI_PPI_DESCRIPTOR_***, which can also be combined into one.
  //
  UINTN       Flags;
  //
  // The address of the EFI_GUID that names the interface.
  //
  EFI_GUID    *Guid;
  //
  // A pointer to the PPI. It contains the information necessary to install a service.
  //
  VOID        *Ppi;
} EFI_PEI_PPI_DESCRIPTOR;

PEI Module 可以通过 PEI Services 来 InstallPPI() 和 ReinstallPPI() 来发布一个有效的PPI, 而其他的 PEI Module 可以使用PEI Services 中的 LocatePPI()来找到需要的PPI。

3. DXE阶段

  DXE(Driver Execution Environment)阶段执行大部分的系统初始化工作,为后续的UEFI和操作系统提供了UEFI的System Tables、Boot Services、Runtime Services。在这个阶段,内存就已经可以正常使用了,大量复杂的工作,比如为硬件提供驱动程序,就都可以实现了。
 DXE阶段的几个组成部分如下:
DXE Foundation(DXE 内核):它抽象于系统硬件,负责DXE的基础服务和执行流程,产生UEFI Boot Services,Runtime Services和DXE Services。
DXE Dispatcher(DXE派遣器):负责初始化系统设备,发现并以正确的顺序执行DXE驱动。
DXE Driver(DXE 驱动):负责初始化处理器、芯片组、系统组件,所有的DXE驱动都可以使用UEFI Boot Services(启动服务)、Runtime Services(运行时服务)和DXE Services(DXE服务)。
 这几个部分协同工作,完成平台的初始化,并提供启动操作系统所需要的服务。
DXE阶段的执行流程与PEI阶段很类似,具体如下:
1)进入DXE Entry(DXE 入口)。
2)根据HOB list初始化系统服务。
3)DXE Dispatcher调度遍历系统中的驱动,直到所有满足调教的驱动都被加载。
4)进入BSD阶段。
在此阶段运行的驱动有两种类型,一种是早期的DXE驱动,另一种是符合UEFI驱动模型的驱动。这两个的区别在于:
前者通常包含基础服务、处理器初始化代码、芯片组初始化代码和平台初始化代码,它会主动寻找设备并初始化它。
后者是系统服务根据设备来寻找驱动,找到合适的驱动然后再执行初始化操作。


前者是 各种初始化代码之类的 -----------主动找--------》 设备
后者是       系统服务 -----根据设备找--------》驱动

4. BDS阶段

  BDS(Boot Device Selection)阶段负责发现每个启动设备,并执行启动策略。他会初始化控制台设备、加载必要的设备驱动,并根据系统设置去加载和执行Boot Option(启动项)。在DXE阶段加载的各个驱动,将在此阶段与系统中的硬件进行匹配连接,使得各个启动设备可以进行读写。
  BDS策略通过全局NVRAM变量配置。操作系统安装完后 [操作系统加载器] 的路径将存储在NVRAM变量中,UEFI可以根据该路径使用操作系统加载器来加载执行操作系统。
  如果BDS阶段启动失败,系统将重新调用DXE Dispatcher,再次进入寻找启动设备的流程。

5. TSL阶段

  TSL(Transient System Load)阶段被称为临时系统,他是UEFI将系统控制权转移给操作系统前的一个中间时段。这一阶段的操作系统加载器是作为UEFI应用程序在执行的,当Boot Services的ExitBootServices()被调用后,系统进入运行时阶段。

在这个阶段,UEFI还提供了人机交互界面,即我们常用的UEFI Shell。此时已经运行到了UEFI的后半部分,所提供的功能已经比较晚辈,具备了操作系统的雏形。许多系统诊断、自动测试等工具都可以在此阶段运行。

6. RT阶段

  在RT(RunTime)阶段,操作系统加载器获得系统的控制权,UEFI的各种系统资源也被转移,启动服务不能再使用,仅保留RunTime Services供OS Loader和OS来使用。

7. AL阶段

  AL(After Life)阶段,在图1-3中没有定义其功能。这个阶段的功能一般由厂商自定义,大多数情况下,可用来进行错误处理和灾难恢复。OS在关机、待机、休眠或者Reset 处理器后,会进入此阶段。

至此,Legacy BIOS和UEFI BIOS就简要的介绍完毕了,在主板BIOS的日常工作中,一般来说,Legacy BIOS几乎遇不到,UEFI BIOS下,开机前4个阶段是重中之重,之后也会详细讨论一下。

  • 30
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误提示是指在使用UEFI启动模式时,出现了BIOS或传统启动模式的问题。可能是由于系统配置或硬件问题导致的。建议检查系统配置和硬件设备,确保它们与UEFI启动模式兼容。如果问题仍然存在,可以尝试更新系统BIOS或联系技术支持获取帮助。 ### 回答2: 首先,BIOSUEFI都是计算机的启动程序,用于控制电脑硬件的初始化和启动。不同之处在于BIOS是老旧的固件接口,而UEFI是新一代的接口。 出现“error bios/legacy boot of uefi”可能有以下几个原因: 1. 如果电脑原本使用BIOS启动,但是用户更改了设置以后切换为UEFI启动,那么可能会出现这个错误。此时需要将设置恢复到原来的状态。 2. 如果从旧的BIOS计算机迁移到新的UEFI计算机,那么有些设置可能会不适用于新的系统,需要在UEFI系统中重新更改设置。 3. 如果尝试使用不兼容的硬件或驱动程序,那么也可能导致这个错误。 解决这个问题的方法一般包括: 1. 将计算机的UEFI设置恢复到默认值,或者将其改为适用于你的硬件和系统的设置。 2. 确认你的硬件和驱动程序都是与UEFI兼容的。 3. 如果在旧的BIOS计算机上安装了新的UEFI系统,那么建议重新安装一个全新的UEFI系统,以确保设置完整和正确。 总之,“error bios/legacy boot of uefi”可能是由于设备设置不正确或者硬件不兼容所致,需要仔细检查设备和设置,并确保CPU和主板支持UEFI。 ### 回答3: 问题简述 UEFI(统一固件接口)是一种取代传统 BIOS(基本输入输出系统)的新型固件。在使用计算机时,可能会遇到“error bios/legacy boot of uefi”这样的错误提示。这个错误提示意味着什么?如何解决这个问题? 问题分析 UEFI 是一种新型的固件,用于取代 BIOS。相比于 BIOS,它提供了更加现代化、安全和高效的系统启动流程。然而,当我们在启动计算机时,有时会遇到这样的错误:error bios/legacy boot of uefi。这个错误提示可能出现在以下情况下: 1. 系统启动模式错误 UEFI 提供了两种启动模式:UEFI 模式和传统模式(也叫 Legacy 模式)。如果您在使用 UEFI 模式启动计算机时,BIOS 配置中却选择了「Legacy Boot」模式,就会出现「error bios/legacy boot of uefi」的错误提示。 2. 引导设备问题 如果您的计算机试图从一个损坏的或不兼容的设备启动操作系统(如软盘或光盘),也会出现这个错误提示。 解决方案 解决“error bios/legacy boot of uefi”错误提示的方法有以下几种: 1. 更改启动模式 如果您在使用 UEFI 模式启动计算机时遇到了这个错误,那么可以尝试将 BIOS 配置中的模式设置为 UEFI,关闭 Legacy 模式即可。 2. 更改启动顺序 检查您的计算机启动顺序是否正确。在 BIOS 配置中,将您的操作系统所在的设备设置为第一启动项。 3. 更换引导设备 如果您的计算机无法从当前选择的引导设备启动,那么可以将启动选项设置为其他可用的选项。如果您之前使用的是软盘或光盘,请尝试更换为 USB 设备或内置硬盘。如果计算机无法识别引导设备,则您可能需要安装操作系统。 结论 “error bios/legacy boot of uefi”这个错误提示通常是由于系统启动模式错误或引导设备问题引起的。要解决这个问题,您需要在 BIOS 中检查启动模式和启动顺序,并更换可能损坏或不兼容的引导设备。如果您仍然无法解决问题,可以尝试重装操作系统或联系计算机制造商获取支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值