admin 管理员组

文章数量: 1184232

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驱动流程

  1. SEC
    CPU第一行指令开始的地方、创建临时内存区、建立栈 、找到PEI的位置进行加载、这部分由汇编语言编写
  2. PEI
    处理器、芯片、主板的初始化、发现物理内存并初始化为永久内存、将PEI阶段的内存和固件卷通过HOB的方式传递给DXE阶段、该阶段可以用的CPU的片上内存和flash
  3. DXE
    初始化更多的memory,系统可以访问4g以内和4g以外的内存、硬件驱动的加载。准备好所有系统的服务
  4. BDS
    启动设备的选择(可以选择进入UEFI shell或加载OS)、用户UI的加载
  5. TSL
    找到os loader进行加载os或进入UEFI shell 执行操作device的debug等、调用ExitBootService()EVENT通知UEFI,要进入OS了,UEFI进行内存释放等处理
  6. RT
    操作系统运行阶段
  7. 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应用,其安装操作系统的步骤主要分为以下几步:

  1. 发现存储设备。
    (在硬盘上)找到固定大小的空间(空间大小是自己配置的,一般512M)
  2. 创建启动分区
    创建GPT分区、格式化成FAT32 (在安装UEFI OS的时候会有一个提示,关于划分如何划分分区)
  3. 在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
  4. 把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:用于选择和启动操作系统的应用。

本文标签: 规范 操作系统 编程