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编程将会逐渐发展成为一股新的潮流。

原创文章,作者:VHANN,如若转载,请注明出处:https://www.506064.com/n/371492.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
VHANNVHANN
上一篇 2025-04-23 18:08
下一篇 2025-04-23 18:08

相关推荐

  • Harris角点检测算法原理与实现

    本文将从多个方面对Harris角点检测算法进行详细的阐述,包括算法原理、实现步骤、代码实现等。 一、Harris角点检测算法原理 Harris角点检测算法是一种经典的计算机视觉算法…

    编程 2025-04-29
  • 瘦脸算法 Python 原理与实现

    本文将从多个方面详细阐述瘦脸算法 Python 实现的原理和方法,包括该算法的意义、流程、代码实现、优化等内容。 一、算法意义 随着科技的发展,瘦脸算法已经成为了人们修图中不可缺少…

    编程 2025-04-29
  • 神经网络BP算法原理

    本文将从多个方面对神经网络BP算法原理进行详细阐述,并给出完整的代码示例。 一、BP算法简介 BP算法是一种常用的神经网络训练算法,其全称为反向传播算法。BP算法的基本思想是通过正…

    编程 2025-04-29
  • GloVe词向量:从原理到应用

    本文将从多个方面对GloVe词向量进行详细的阐述,包括其原理、优缺点、应用以及代码实现。如果你对词向量感兴趣,那么这篇文章将会是一次很好的学习体验。 一、原理 GloVe(Glob…

    编程 2025-04-27
  • 编译原理语法分析思维导图

    本文将从以下几个方面详细阐述编译原理语法分析思维导图: 一、语法分析介绍 1.1 语法分析的定义 语法分析是编译器中将输入的字符流转换成抽象语法树的一个过程。该过程的目的是确保输入…

    编程 2025-04-27
  • Python字典底层原理用法介绍

    本文将以Python字典底层原理为中心,从多个方面详细阐述。字典是Python语言的重要组成部分,具有非常强大的功能,掌握其底层原理对于学习和使用Python将是非常有帮助的。 一…

    编程 2025-04-25
  • Grep 精准匹配:探究匹配原理和常见应用

    一、什么是 Grep 精准匹配 Grep 是一款在 Linux 系统下常用的文本搜索和处理工具,精准匹配是它最常用的一个功能。Grep 精准匹配是指在一个文本文件中查找与指定模式完…

    编程 2025-04-25
  • 深入探讨冯诺依曼原理

    一、原理概述 冯诺依曼原理,又称“存储程序控制原理”,是指计算机的程序和数据都存储在同一个存储器中,并且通过一个统一的总线来传输数据。这个原理的提出,是计算机科学发展中的重大进展,…

    编程 2025-04-25
  • 朴素贝叶斯原理详解

    一、朴素贝叶斯基础 朴素贝叶斯是一种基于贝叶斯定理的算法,用于分类和预测。贝叶斯定理是一种计算条件概率的方法,即已知某些条件下,某事件发生的概率,求某条件下另一事件发生的概率。朴素…

    编程 2025-04-25
  • 单点登录原理

    一、什么是单点登录 单点登录(Single Sign On,SSO)指的是用户只需要登录一次,在多个应用系统中使用同一个账号和密码登录,而且在所有系统中都可以使用,而不需要在每个系…

    编程 2025-04-25

发表回复

登录后才能评论