首页 > 编程语言 >UEFI原理与编程(一)

UEFI原理与编程(一)

时间:2024-09-10 17:05:36浏览次数:11  
标签:文件 PEI 编程 阶段 模块 原理 OS UEFI

第一章 UEFI概述(Unified Extensible Firmware Interface 统一的可扩展固件接口)

常见缩写及描述:

缩略词 全名 描述
UEFI Unified Extensible Firmware Interface 统一的可扩展固件接口
BS Boot Services 启动服务
RT Runtime Service 运行时服务
BIOS Basic Input Output System 基本输入输出系统

1. UEFI系统的启动过程

image

1 SEC阶段

SEC(Security Phase)阶段是平台初始化的第一个阶段,计算机系统加电后进入这个阶段。功能上说,它执行以下四种任务:

  • 接收并处理系统启动和重启信号
  • 初始化临时存储区域
  • 作为可信系统的根
  • 传递系统参数给下一阶段(即PEI)

如下信息作为参数传递给PEI的入口函数:

  • 系统当前状态,PEI 可以根据这些状态判断系统的健康状况。
  • 可启动固件(Boot Firmware Volume)的地址和大小。
  • 临时RAM区域的地址和大小。
  • 栈的地址和大小。

2 PEI阶段

PEI(Pre-EFI Initialization)阶段, 其主要功能是为DXE 准备执行环境,将需要传递到DXE 的信息组成HOB(Handoff Block)列表,最终将控制权转交到DXE 手中。

UEFI 的一个重要特点是其模块化的设计。模块载入内存后生成Image。Image 的入口函数为_ModuleEntryPoint,PEI 也是一个模块。

3 DXE阶段

DXE(Driver Execution Environment)阶段执行大部分系统初始化工作,进入此阶段时,内存已经可以被完全使用,因而此阶段可以进行大量的复杂工作

4 BDS阶段

BDS(Boot Device Selection)的主要功能是执行启动策略,其主要功能包括:

5 TSL阶段

TSL(Transient System Load)是操作系统加载器(OS Loader)执行的第一阶段,

6 RT阶段

系统进入RT(Run Time)阶段后,系统的控制权从UEFI 内核转交到OS Loader 手中,
UEFI 占用的各种资源被回收到OS Loader,仅有UEFI 运行时服务保留给OS Loader 和OS

使用。随着OS Loader 的执行,OS 最终取得对系统的控制权。

7 AL阶段

在RT 阶段,如果系统(硬件或软件)遇到灾难性错误,系统固件需要提供错误处理和
灾难恢复机制,这种机制运行在AL(After Life)阶段。UEFI 和UEFI PI 标准都没有定义此阶段的行为和规范。

第二章 UEFI开发环境搭建

略(主要一些工具安装以及编译EDK2, 后续有机会以现实环境为例描述)

第三章 UEFI工程模块文件

标准应用程序工程模块是其他应用程序工程模块的基础,也是UEFI中常见的一种应用程序工程模块。每个工程模块由两部分组成:工程文件和源文件。
image

1 .inf 文件

.inf(Module Information File)文件(#后面内容为注释)。.inf 文件是模块的工程文件,其作用相当于Makef ile 文件或Visual Studio 的.proj 文件,用于指导EDK2 编译工具自动编译模块。

工程文件分为很多个块,每个块以 “[块名]” 开头, “[块名]” 必须独占一行。

必须块 块描述
[Defines] 定义本模块的属性及其他变量,这些变量可在工程文件其他块中引用
[Sources] 列出本模块所有的源文件及资源文件
[Packages] 列出本模块引用到的所有包的包声明文件,
可能引用到的资源包括头文件,GUID, Protocol等这些资源都声明在文件 .dec中
[LibraryClasses] 列出本模块要链接的库模块
非必须块 块描述
[Protocols] 列出本模块用到的Protocol
[Guids] 列出本模块用到的GUID
[BuildOptions] 指定编译和链接选项

2 .dec 文件

.dec 文件定义了公开的数据和接口,供其他模块使用。它包含了必需区块[Defines] 以及可选区块[Includes]、[LibraryClasses]、[Guids]、[Protocols]、[Ppis] 和[PCD] 几个部分。

.dec文件需要被调用模块.inf文件所包含。

块编译生成 .efi 文件, shell 中执行 .efi文件时,Shell首先用gBS->LoadImage() 将 .efi 文件加载到内存生成Image 对象。然后调用gBS->StartImage(Image) 启动这个Image对象(efi 设备路径,命令参数,uefi环境变量 详见EFI_STATUS EFIAPI InternalShellExecuteDevicePath ) 。StartImage 主要作用就是找出可执行程序映像(Image)的入口函数并执行。,对应用程序来说,就是_ModuleEntryPoint 函数。进入_ModuleEntryPoint(配置在.inf块中的入口函数 ) 后,控制权才转交给应用程序(此处就是我们的 .efi)。

[Defines]块用于提供Package的名称、GUID、版本号等信息。

## /EDK2/MdePkg/MdePkg.dec
[Defines]
  DEC_SPECIFICATION              = 0x00010005
  PACKAGE_NAME                   = MdePkg
  PACKAGE_UNI_FILE               = MdePkg.uni
  PACKAGE_GUID                   = 1E73767F-8F52-4603-AEB4-F29B510B6766
  PACKAGE_VERSION                = 1.06

[Includes]块
列出本Package提供的头文件所在的目录

## /EDK2/MdePkg/MdePkg.dec
[Includes]
  Include

[Includes.IA32]
  Include/Ia32

[Includes.X64]
  Include/X64

3 .dsc文件

.inf 用于编译一个模块, 而.dsc 文件用于编译一个Package,

标签:文件,PEI,编程,阶段,模块,原理,OS,UEFI
From: https://www.cnblogs.com/linhaostudy/p/18406740

相关文章

  • 布隆过滤器(Bloom Filter)原理+实战
    布隆过滤器的作用是:可用来判断值可能在集合中和绝对不在集合中介绍布隆过滤器(BloomFilter)是1970年由布隆提出的。它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(hash函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远......
  • Yarn原理图
            Yarn是hadoop的三大组件之一,是资源调度器,负责资源调度和资源的分配。具体原理如下图:        客户端向resourceManager发送资源请求。        RM接收到请求之后,会在某一台机器上创建ApplicationMaster,并建立心跳机制进行反向注册,并合计自......
  • Kafka集群搭建与基本原理详解
    目录一、Kafka介绍1、MQ的作用MQ的作用主要有以下三个方面:1.异步2.解耦3.削峰2、为什么要用Kafka(特点)二、Kafka快速上手1、实验环境2、单机服务体验1、启动Kafka之前需要先启动Zookeeper。2、启动Kafka。3、简单收发消息4、其他消费模式指定消费进度分组......
  • 基于django+vueblockly少儿编程在线学习网站【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,编程教育逐渐从高等教育向基础教育渗透,成为培养未来社会创新人才的重要途径。少儿编程作为这一趋势的前沿阵地,其重......
  • Java学习 - 网络编程
    1.网络编程入门1.1网络编程概述计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统网络编程在网络通信协议下,不同计算机上运行的程序......
  • 创建一个CANoe仿真工程之一--------CAPL编程,全仿真实战
    以demo002为例,整理思路control可以看做是控制器  display看做是显示器两者要建立联系1.引擎点火(钥匙往右拧开)同时小汽车显示灯要亮起来可以看到引擎开关关联的是系统变量,也就是打开开关,系统变量的值会发生变化,如果同时需要小汽车显示灯亮起来,那么就需要把系统变量的......
  • js中【异步编程】超详细解读,看这一篇就够了
    一、JavaScript异步编程概述JavaScript是一门单线程语言,这意味着它同一时间只能执行一个任务。在现代Web开发中,异步编程变得尤为重要,因为许多任务(如网络请求、文件读取、定时器等)需要大量时间,如果使用同步编程模型,这些任务会阻塞整个线程,导致页面或程序卡顿。为了解决这个......
  • 【C/C++】“秒懂”学C/C++不可错过的“经典编程题” — 日期类的经典运用 (含题链接)
    “秒懂”学C/C++不可错过的“经典编程题”—日期类的经典运用(含题链接)1.计算日期到天数转换(1).解题思路:(2).代码实现:2.打印日期(1).解题思路:(2).代码实现:3.日期累加(1).解题思路:(2).代码实现:4.日期差值(1).解题思路:(2).代码实现:1.计算日期到天......
  • 一周的豆包MarsCode 编程助手全面测评
    豆包MarsCode编程助手安装步骤进入豆包MarsCode官方网站,sourl.cn/yWAtYr点击登陆/注册账号点击【立即获取编程助手】下载对应插件,我这里是用vscode安装豆包MarsCode编程助手豆包MarsCode,基于豆包大模型的智能开发工具,提供CloudIDE及AI编程助手两种使用形态,具备代码补全......
  • UEFI原理与编程(四)(dec dsc inf文件)
    1.inf文件以下面.inf文件为例[Defines]#块用于定义模块的属性和其他变量,块内定义的变量可被其他块引用INF_VERSION=0x00010006#INF标准的版本号,前半部分主版本号,后半次版本号BASE_NAME=Main......