UEFI及其相关的名词解释
- UEFI: (Unified Extensible Firmware Interface,统一可扩展固件接口) 是一个 固件标准或规范 。它定义了一种在操作系统启动之前,在硬件和操作系统之间进行通信的接口标准。UEFI 本身不是具体的软件,而是一套 由 UEFI 论坛制定的公开技术标准 ,规定了固件应该如何编写才能实现快速启动、安全启动、支持大硬盘等功能。
- UEFI规范: (UEFI Specification) UEFI 规范 就是上面提到的 UEFI 标准的具体文本和文档 。它是UEFI标准的完整、官方的技术定义文件。如果说UEFI是一个想法,那么UEFI规范就是这个想法的详细设计图纸。
- UEFI BIOS: 这是一个普遍使用但不够精确的术语,用来指代实际安装在电脑主板上的、 遵循UEFI规范的固件产品 。它是UEFI标准的具体实现。使用“BIOS”这个词是因为传统BIOS在用户心中根深蒂固,为了便于理解,人们将遵循新标准(UEFI)的固件也称为“BIOS”,从而产生了“UEFI
BIOS”这个叫法。
UEFI规范只提供了规范,并没有提供实现,其实现是由其他公司或开源组织提供的。
-
Tianocore:
⽀持统⼀可扩展固件接⼝(Unified Extensible Firmware Interface, UEFI)开源实现的社区。 -
EDK II:
是⼀个现代的、功能丰富的跨平台固件开发环境,⽤于UEFI和UEFI平台初始化(PI)规范。
软件平台:
传统BIOS与UEFI BIOS的对比
UEFI驱动流程
-
SEC
CPU第一行指令开始的地方、创建临时内存区、建立栈 、找到PEI的位置进行加载、这部分由汇编语言编写 -
PEI
处理器、芯片、主板的初始化、发现物理内存并初始化为永久内存、将PEI阶段的内存和固件卷通过HOB的方式传递给DXE阶段、该阶段可以用的CPU的片上内存和flash -
DXE
初始化更多的memory,系统可以访问4g以内和4g以外的内存、硬件驱动的加载。准备好所有系统的服务 -
BDS
启动设备的选择(可以选择进入UEFI shell或加载OS)、用户UI的加载 -
TSL
找到os loader进行加载os或进入UEFI shell 执行操作device的debug等、调用ExitBootService()EVENT通知UEFI,要进入OS了,UEFI进行内存释放等处理 -
RT
操作系统运行阶段 -
AL
灾难恢复、关机等
UEFI SystemTable
UEFI System Table 是UEFI固件提供的一个重要数据结构,包含系统的各种信息和服务接口。它是UEFI的核心部分,是 UEFI 固件在启动阶段传递给操作系统加载器(OS Loader)或内核的一个核心数据结构。提供了指向 UEFI 环境中所有关键服务和信息的指针。
-
提供的主要功能:
- Firmware:提供固件版本和厂商信息,帮助识别固件的特性和兼容性。
- ConIn操作接口
- ConOut操作接口
- Stderr接口错误输出接口
- Boot Services:提供系统启动期间可用的服务,如内存分配、设备管理和事件处理。
- Runtime Services:在操作系统启动后仍然可用的服务,如时间获取和变量管理。
-
EFI_CONFIGURATION_TABLE:提供系统配置表
- ACPI (Advanced Configuration and Power Interface) Table
- SMBIOS (System Management BIOS) Table
- UEFI Variable Services Table
- … …
////// EFI System Table///typedefstruct{////// The table header for the EFI System Table.///
EFI_TABLE_HEADER Hdr;////// A pointer to a null terminated string that identifies the vendor/// that produces the system firmware for the platform.///
CHAR16 *FirmwareVendor;////// A firmware vendor specific value that identifies the revision/// of the system firmware for the platform.///
UINT32 FirmwareRevision;////// The handle for the active console input device. This handle must support/// EFI_SIMPLE_TEXT_INPUT_PROTOCOL and EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL.///
EFI_HANDLE ConsoleInHandle;////// A pointer to the EFI_SIMPLE_TEXT_INPUT_PROTOCOL interface that is/// associated with ConsoleInHandle.///
EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn;////// The handle for the active console output device.///
EFI_HANDLE ConsoleOutHandle;////// A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface/// that is associated with ConsoleOutHandle.///
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;////// The handle for the active standard error console device./// This handle must support the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.///
EFI_HANDLE StandardErrorHandle;////// A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface/// that is associated with StandardErrorHandle.///
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *StdErr;////// A pointer to the EFI Runtime Services Table.///
EFI_RUNTIME_SERVICES *RuntimeServices;////// A pointer to the EFI Boot Services Table.///
EFI_BOOT_SERVICES *BootServices;////// The number of system configuration tables in the buffer ConfigurationTable.///
UINTN NumberOfTableEntries;////// A pointer to the system configuration tables./// The number of entries in the table is NumberOfTableEntries.///
EFI_CONFIGURATION_TABLE *ConfigurationTable;} EFI_SYSTEM_TABLE;UEFI 安装与引导操作系统
操作系统安装器 —— OS Installer
OS Installer用于发现和安装操作系统,他是由OS厂商提供的一个EFI应用,其安装操作系统的步骤主要分为以下几步:
-
发现存储设备。
(在硬盘上)找到固定大小的空间(空间大小是自己配置的,一般512M) -
创建启动分区
创建GPT分区、格式化成FAT32 (在安装UEFI OS的时候会有一个提示,关于划分如何划分分区) -
在BIOS中设置启动路径用于UEFI BIOS启动OS。
创建一个efi的variable(BootXXX),作为OS Loader存放的固定路径。这样下次启动的时候BIOS中的BDS (启动设备管理器)就会知道存在这样一个设备os loader并进行加载,这样在页面上就会有一个OS loader的选项,选择后就会boot到OS。例如:/efi/boot/bootx64.efi /efi/redhat/grub.efi - 把OS Loader放到上面格式化好的路径下。
操作系统加载器—— OS Loader
OS Loader类似于UEFI上的一个应用,一般由OS厂商提供,用于引导操作系统。
- 前面提到OS installer运行时,会将OS Loader放在固定的路径下,UEFI平台BDS(启动设备管理器)会根据设置直接运行OS Loader;
- OS Loader需要将操作系统内核从存储介质加载到物理内存的指定地址;
- OS Loader使用UEFI的标准API收集系统资源信息并传递给OS。OS Loader在加载内核后触发 ExitBootServices() EVENT 之后,控制权就交给OS(BIOS和OS交接的时间点)。
OS Loader与OS工作交接的关键流程如下:
UEFI中的应用、驱动、库
前面说到 OS Installer和OS Loader都是属于UEFI中的应用,那么除了UEFI应用还有什么?
-
库:提供通用功能,方便其他模块使用。
BaseLib:提供基础功能,如内存分配和字符串操作。
DevicePathLib:处理设备路径相关操作的库,方便设备识别和管理。
PrintLib:提供打印功能的库,用于格式化和输出字符串。 -
驱动:控制硬件设备,提供设备访问接口。
NVMe Driver:控制NVMe存储设备,提供数据传输和管理。
USB Driver:管理USB设备的驱动程序,支持USB设备的连接和通信。
Graphics Output Protocol Driver:提供图形输出功能,支持显示设备的初始化和图形渲染。 -
应用:独立程序,执行特定任务,通常与用户交互。
UEFI Shell:交互式命令行界面,允许用户执行命令和脚本。
Boot Manager:用于选择和启动操作系统的应用。


发布评论