服务器如何启动:UEFI



以前,我们已经以旧版Legacy为例来分析服务器启动顺序。现在是时候更好地了解UEFI了。



现在称为统一扩展固件接口(UEFI)的第一个版本是在上个千年的90年代开发的,专门用于Intel®Itanium®系统,被称为Intel Boot Initiative,后来称为EFI。



期望“更新”引导过程。PC-BIOS,现在称为旧版,提供在16位实模式下工作,仅寻址1 MB RAM,并且引导加载程序和分区表必须位于驱动器的前512个字节中。而且,PC-BIOS将控制权转移到第一个找到的引导加载程序,而没有返回的可能性。在这种情况下,具有多个操作系统的机箱的处理将放在引导程序的肩膀上。



引导加载程序的大小限制规定了使用主引导记录(MBR)标记,该标记出现在1983年。MBR不是标准化的,但是许多供应商是“传统的”。MBR具有严重的局限性:默认情况下仅支持4个分区,并且存储容量不超过2.2 TB。



2000年12月,第一个广泛使用的EFI规范在1.02版下发布。五年后,英特尔将EFI转移到UEFI论坛,并在标题中添加了Unified以突出显示更改。UEFI规范是公开可用的,并且包含多个文档:



  • ACPI规范;
  • UEFI规范;
  • UEFI Shell规范;
  • UEFI平台初始化规范;
  • UEFI平台初始化分发包装规范。


有趣之处始于UEFI平台初始化规范,该规范描述了加载平台的所有阶段。



UEFI是通用的,但是在本文中,我们将依靠该标准,以x86_64体系结构上的处理器为目标。



醒醒,尼奥!



UEFI引导阶段序列(UEFI平台初始化规范),

在启动平台加电之后,电源会等待直到瞬态完成为止,然后将信号设置为Power_Good线最早开始运行的不是中央处理器,而是与之类似的自治子系统英特尔®管理引擎(ME)AMD安全技术(ST)该子系统执行其自身的操作,然后准备并启动称为引导处理器(BSP)的单个处理器的第一个核心

根据公认的术语,核心/处理器线程在下文中将被称为引导处理器或应用处理器。
与传统一样,处理器在地址空间的末尾0xFFFFFFF0开始执行第一条指令该指令是对平台初始化的第一阶段SEC的跳转。



SEC(安全)阶段



在此阶段,应解决以下任务:



  • 处理启用事件;
  • 为下一阶段初始化足够的内存;
  • 建立对系统的信任根;
  • 将必要的信息和控制权转移到下一阶段。


X86_64处理器以16位实模式启动,并且在初始初始化期间,BSP进入32位保护模式。然后,所有可用处理器的微代码都会更新。



接下来是启用事件的处理。这意味着将汇总有关设备状态的信息,以便在下一阶段中某些模块可以得出有关平台的“运行状况”和一般状态的结论。



在SEC阶段,不进行RAM初始化。而是将空闲处理器缓存标记为不可刷新,并转换为临时RAM。此模式称为无驱逐模式(NEM)...在分配的内存中创建一个堆栈,这将允许下一阶段的模块在初始化主RAM之前使用堆栈编程语言。



此外,所有应用程序处理器(Application Processors,AP)都使用发送给它们的特殊处理器间中断序列(Inter-Processor Interrupt,IPI)进行初始化。初始化IPI序列-启动IPI-唤醒应用处理器并在其上启动内置自测(BIST)。记录测试结果并传递给分析。



在安全阶段结束时,您需要找到“启动固件卷(BFV)”部分,下一阶段的可执行代码位于该代码上,并在可能的情况下找到其他带有代码(固件卷,FV)的次要部分。



为了证明安全阶段的名称并成为信任的根源,在执行此阶段期间,可以检查我们计划将控制权转移到的代码是否存在未经授权的更改和程序的恶意部分。



在SEC执行结束时,将收集以下信息:



  • 引导固件卷(BFV)的大小和地址;
  • 其他固件卷(FV)的大小和地址;
  • 临时RAM的大小和地址;
  • 堆栈的大小和地址。


然后下一个阶段开始-预EFI初始化。



PEI(EFI初始化前)阶段



SuperMicro主板上的PEI阶段

EFI初始化前阶段的目的是收集有关已连接设备的信息,并准备最少的硬件数量以运行完整的初始化过程。



通过设计,PEI阶段应该是轻量级的,因为处理器缓存有限。另外,PEI阶段可以从故障中恢复,因此需要将PEI阶段代码放在更具弹性的存储中。



此阶段包含一个称为PEI Foundation的内核和PEI模块(PEIM)插件。内核的中心是模块管理器PEI Dispatcher,它控制模块的执行顺序,并组织模块间的交互(PEIM到PEIM接口,PPI)。



请注意,SEC阶段是从主板上的闪存执行的,并且仅在PEI开始时,该阶段所需的可执行代码才被复制到临时RAM中。



接下来是PEI调度程序。它以特定顺序启动PEI模块:首先,不依赖模块,然后再依赖模块,依此类推,直到模块用完。



PEI阶段的体系结构允许您开发自己的模块,这些模块可以将其活动的结果转移到下一个阶段。信息传输是通过特殊的切换块(HOB)数据结构进行的



在启动PEI模块的过程中,请注意以下几点:



  • CPU PEIM-处理器初始化;
  • 平台PEIM-北部(包括内存控制器中枢)和南部(I / O控制器中枢)桥的初始化;
  • 内存初始化PEIM-主RAM的初始化以及数据从临时存储器到RAM的传输。


以前,列入是从SEC阶段收到的。如果开机事件是S3 Resume,那么接下来将执行S3 BootScript,它将还原处理器和所有连接的设备的保存状态,然后将控制权直接转移到OS。

S3(挂起至RAM)状态是一种睡眠状态,其中处理器和部分芯片组由于上下文丢失而关闭。从此状态唤醒后,处理器将开始执行,就像正常上电一样。但是,除了完全初始化和通过所有测试之外,系统仅限于还原所有设备的状态。
从任何其他状态启动后,控制权将转移到驱动程序执行环境阶段。



DXE(驱动程序执行环境)阶段



DXE

阶段AHCI初始化驱动程序执行环境(DXE)阶段着重于初始化其余设备。到DXE阶段开始时,处理器和主内存就可以工作了,并且DXE驱动程序不受严格的资源限制。



与PEI基金会类似,此阶段有其自己的核心-DXE基金会内核创建必要的接口并加载三种DXE服务:



  • UEFI引导服务-引导时间服务;
  • UEFI Runtime Services-运行时服务;
  • DXE服务是DXE核心所需的特殊服务。


初始化服务后,DXE Dispatcher开始工作它查找并加载DXE驱动程序,从而完成硬件初始化。

在UEFI中,没有专用阶段可以使硬件通过POST(开机自测)。取而代之的是,每个PEI和DXE阶段模块都进行自己的一组测试,并通过POST代码将其传达给用户,并在接下来的阶段中通过HOB进行通信。
在x86_64处理器上加载的许多驱动程序中,值得注意的是系统管理模式初始化(​​SMM Init)驱动程序。该驱动程序为系统管理模式(SMM)做好了一切准备。 SMM是一种特殊的特权模式,它允许您挂起当前代码(包括操作系统)的执行,并在其自身上下文中SMRAM的保护区执行程序

SMM被非正式地认为是-2保护环OS内核在环0上运行,保护级别更高的保护环编号为1到3。正式地,零环被认为是特权最高的环。但是,硬件虚拟化的虚拟机管理程序通常称为环-1,而英特尔ME和AMD ST则称为环-3。
此外,我们注意到兼容性支持模块(CSM),它确保与旧版兼容,并允许您在没有UEFI支持的情况下引导操作系统。稍后我们将更详细地介绍该模块。



初始化所有设备之后,该选择引导设备了。



BDS(引导设备选择)阶段



引导设备选择阶段将实施UEFI应用程序引导策略。尽管这是一个单独的阶段,但是在DXE阶段创建的所有服务(包括调度程序)仍然可用。



BDS阶段的目的是完成以下任务:



  • 控制台设备的初始化;
  • 搜索可以启动的设备;
  • 尝试按优先级顺序从找到的设备引导。


LSI附加

卡的PCIe BIOS引导管理器在设备上寻找可引导区域。某些扩充卡(例如网卡和RAID控制器)可能具有称为Option ROMOpROM的自己的“ BIOS”。检测到后立即启动OpROM设备的内容,执行后,控制权返回到引导管理器。



包含下载区域的所有分区都存储在引导管理器的内存中,并根据引导顺序进行排序。如果未找到任何应​​用程序,则启动管理器可以调用DXE管理器,以防管理器在搜索过程中加载了其他驱动程序,并且新设备可能会“打开”至启动管理器。



如前所述,主引导记录标记的使用对分区的大小及其在驱动器上的数量施加了限制,并且在维护多个操作系统方面也带来了某些不便。所有这些问题的解决方案是UEFI规范-GUID分区表的一部分。



GPT(GUID分区表)



GUID分区表是一种标准的分区表格式,可替代旧版MBR。



首先,GPT使用逻辑块寻址(LBA)而不是气缸,磁头,扇区(CHS)寻址。更改寻址方式后,GPT可以使用高达9.4 ZB(9.4 * 10 21字节)的驱动器,而MBR则为2.2 TB。



其次,分区表已经发生了变化,现在您可以在一个驱动器中最多创建2 64个分区,尽管操作系统在Microsoft Windows中最多支持128分区,Linux中最多支持256分区。



第三,每个部分都有其自己的类型标识符,用于描述该部分的用途。因此,例如,标识符C12A7328-F81F-11D2-BA4B-00A0C93EC93B唯一地指向EFI系统分区(ESP),引导管理器可以尝试从该文件中加载应用程序。



在GPT的开发过程中,与MBR的兼容性一直存在。磁盘实用程序可能无法识别GPT磁盘并擦除它。为避免这种情况,在GPT分区期间,前512个字节填充了保护性MBR(保护性MBR),即整个驱动器的一个分区中的一个分区,系统标识符为0xEE。这种方法使UEFI可以了解到它不是它前面的真实MBR,而是没有GPT支持的旧软件-查看包含未知类型数据的分区。



GPT放弃了引导区域,转而支持被认为是可引导的ESP分区。引导管理器收集有关磁盘上所有ESP的信息,这使您可以在驱动器上有多个引导加载程序而不会发生冲突,每个引导加载程序一个。



加载操作系统



轮询所有设备并查找引导区后,Boot Manager将按引导优先级顺序开始引导。通常,控制权将转移到UEFI应用程序,UEFI应用程序开始执行其逻辑。但是,对于具有传统模式兼容性的系统,引导区域列表中可能会有MBR,您将不得不转至兼容性支持模块CSM。



CSM允许您运行不支持UEFI的操作系统。为了加载这样的操作系统,CSM模块模拟了“经典”操作系统所处的环境:



  • 加载旧版驱动程序;
  • 加载旧版BIOS;
  • 将视频输出置于传统兼容模式;
  • 创建在UEFI中不可用的传统内存所需的数据结构;
  • 加载SMM的CompatibilitySmm驱动程序以在Legacy中工作。


回想一下,在传统模式下,操作系统以16位模式启动,而在UEFI中,一切都在32位模式下运行。CSM以16位模式启动Legacy引导加载程序,并根据需要提供与32位UEFI驱动程序的通信。



阶段RT(运行时间)



开始加载OS或旧版引导加载程序会导致运行时阶段的开始。在此阶段,所有DXE服务(UEFI运行时服务除外)将不再可用。



RT阶段的内容可以变化。 Legacy可能有一个OS加载程序,例如GRUB2或Windows Boot Manager,它们将处理器置于64位模式并启动OS。但是可以有独立的应用程序,也可以只有操作系统的内核。



如果存在CONFIG_EFI_STUB标志,则从版本3.3开始的Linux内核将变成常规的UEFI应用程序,并且可以从UEFI启动,而无需使用第三方引导加载程序。



与旧版一样,引导加载程序或内核本身需要将处理器置于64位模式,加载所有驱动程序,配置调度程序并运行init。依次,Init启动用户空间中的进程,然后出现OS登录窗口。



结论



引导至UEFI是一个更为复杂但标准化且很大程度上通用的过程。与Legacy的相似之处仅是一般性的观察,而恶魔在细节中。



您认为完全可以离开Legacy多久了?

在评论中写下您的意见。



All Articles