您的位置:

UEFI编程原理与实践

UEFI(Unified Extensible Firmware Interface),是一种新的系统启动方式,它在BIOS的基础上,给计算机硬件提供了更多的控制和管理能力,使得计算机开机变得更快、更安全,并具有更强的扩展性。本文将从UEFI原理、UEFI编程实践等多个方面对UEFI做详细的阐述。

一、UEFI原理

UEFI相比于传统BIOS的区别在于UEFI提供了更为丰富的接口和更强的扩展能力。UEFI使用了EFI手册定义的Boot Services,Runtime Services以及Protocol来管理和控制操作系统。Boot Services包括了哪些设备和文件可以被加载,如何初始化EMU等功能。Runtime Services包括了与操作系统生命周期相关的代码和数据等。Protocol则是用来把服务提供者和服务消费者联系起来的一种设施。

UEFI的框架基于两个核心的抽象层:EFI仅使用4KB栈量大小的体系结构,并且支持从其启动的唯一操作系统为64位 x86。UEFI还支持IA-64和ARMv8架构。从内部API的角度看,UEFI主要由两个框架组成:Boot Services和Runtime Services。

以UEFI启动为例,UEFI系统启动时,会读入一个文件system image,启动时通过内置的EFI Firmware File System将文件读入到内存中。然后将文件加载到特殊的内存映射区域即被称为EFI Configuration Table的地方。该内存映射区域采用统一的结构化的可扩展固件接口(SMBIOS)数据存储。SMBIOS存储了主板、CPU、内存和硬盘等相关系统信息。

二、UEFI编程实践

1、UEFI程序框架

与传统的BISO相比,UEFI要求一些特殊的编程模式,例如在UEFI中要求所有的服务都是异步执行,因此在编写UEFI程序时,一般遵循以下的框架:

#include 
#include 
   
#include 
    

EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
{
    //Do Something
    return EFI_SUCCESS;
}

    
   
  

其中UefiMain为UEFI程序的入口,其余代码为标准的C语言代码。在UefiMain中,可以使用EFI系统接口调用UEFI框架中的各种服务,例如加载驱动程序、打印调试信息等操作。

2、UEFI驱动编程

UEFI驱动是指在UEFI系统上运行的一种具体的软件,其作用是提供硬件设备的服务,例如提供关于启动设备的信息、实现硬件设备的初始化和管理等。

以编写简单的磁盘驱动程序为例,其主要实现以下几步:

(1)注册协议

在EFi系统启动后,UEFI执行的程序通过注册协议来发布自己提供的服务。注册协议的要求是在系统初始化阶段,通过调用EfiBootServices中的EFI_STATUS EFI_BOOT_SERVICES.InstallProtocolInterface()或EFI_SATUS EFI_BOOT_SERVICES_.InstallMultipleProtocolInterfaces()函数,为驱动程序提供服务。

(2)实现协议接口

在注册协议后,UEFI驱动程序需要为协议接口实现函数。在UEFI框架中,协议作为一种接口存在,驱动程序必须为这些接口实现一套对应的函数。

(3)添加平台设备驱动

驱动开始为特定的ETI驱动设备制定管理程序。驱动可以使用块操作,对用于磁盘或其他块设备的数据结构进行操作、搜索分区和读取文件系统等操作。块IO接口是UEFI系统编程中最重要的一个接口,他包含了处理磁盘和其他块设备的大部分功能。

三、UEFI启动原理

UEFI启动过程包含四个主要的阶段:

(1)SEC(Security)阶段

作为计算机系统安全启动的第一个步骤,SEC为UEFI BIOS固件提供最基本的安全框架和初始状态,SEC第一条指令的执行将引导到PEI阶段。SEC的主要任务包括检测UEFI镜像的有效性以及加载它,并检测用于PEI阶段的FV。为了更快和更严格的执行SEC阶段,SEC本身只翻译UEFI协议,不执行UEFI的服务,也不进入UEFI内存中。

(2)PEI(Pre-EFI Initialization)阶段

PEI阶段为UEFI固件提供了更多的功能,并更好地利用了UEFI固件中的每一个资源。PEI阶段的主要任务是初始化和验证UEFI镜像中FV内的PEI。对于UEFI PEIM模块,可提供内存查找/分类器、硬件驱动、CPU架构机制、内存操作、读写CMOS、加密支持、选择启动设备和保留内存等功能。

(3)DXE(Driver Execution Environment)阶段

DXE阶段是UEFI初始化的关键部分。在DXE阶段,UEFI协议服务被激活,驱动程序被加载,空间被重复利用,并且各种服务开始执行。输入和输出功能是由UEFI协议定义的,以系统管理层服务和标准协议形式提供。此处运行DXE Driver、BDS以及一些BS Driver。

(4)BDS(Boot Devices Selection/preparation)阶段

BDS阶段主要功能是选择启动设备,若多个启动设备可以用来启动,那么如逻辑设备启动顺序、启动支持协议、启动option、各种条件和用户设置都可能会影响最终启动设备的选择。BDS阶段还包括了操作系统启动前需要准备的所有服务。例如,UEFI操作系统引导程序、Shell Manager和Shell启动。

结语

本文介绍了UEFI的原理、编程实践以及启动原理等多个方面的内容。UEFI相比于传统BIOS和普通的系统编程,具有更高的灵活性、更好的扩展性、运行更加可靠和更快的启动速度等优点,今后UEFI编程将会逐渐发展成为一股新的潮流。