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

常见缩写及描述:

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

1. UEFI系统的启动过程

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中常见的一种应用程序工程模块。每个工程模块由两部分组成:工程文件和源文件。

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,

UEFI原理与编程(一)的更多相关文章

  1. 【读书笔记】UEFI原理与编程(1)概述及开发环境的搭建

    一.概述: 0.为什么会有这篇文章 说实在的,在2016初的时候,我就萌生了写一个操作系统的念头,但是这对于我一个菜鸟来说,犹如登天. 既然想了就去写,即使最后做不完,也不后悔. 抱着这样的念头,我开 ...

  2. Contiki源码+原理+功能+编程+移植+驱动+网络(转)

    源:Contiki源码+原理+功能+编程+移植+驱动+网络 请链接:http://www.rimelink.com/nd.jsp? id=31&_np=105_315 假设您对于用Contik ...

  3. trident原理及编程指南

    目录 trident原理及编程指南 一.理论介绍 1.trident是什么? 2.trident处理单位 3.事务类型 二.编程指南 1.定义输入流 2.统计单词数量 3.输出统计结果 4.split ...

  4. 超级干货:动态防御WAF技术原理及编程实战!

    本文带给大家的内容是动态防御WAF的技术原理及编程实战. 将通过介绍ShareWAF的核心技术点,向大家展示动态防御的优势.实现思路,并以编程实战的方式向大家展示如何在WAF产品开发过程中应用动态防御 ...

  5. 给初学者的STM32(Cortex-M3)中断原理及编程方法介绍 [原创www.cnblogs.com/helesheng]

    本人编著的<基于STM32的嵌入式系统原理及应用>(ISBN:9787030697974)刚刚在科学出版社出版.这本书花费了半年以上的时间,凝聚了笔者作为高校教师和嵌入式工程师的一些经验, ...

  6. Socket原理与编程基础

    一.Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机的 ...

  7. 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(二)kmeans

    (上接第二章) 4.3.1 KMeans 算法流程 算法的过程如下: (1)从N个数据文档随机选取K个文档作为质心 (2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类 (3)重新计 ...

  8. Socket原理与编程基础(转)

    一.Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机的 ...

  9. Socket 之 原理与编程基础

    一.Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机的 ...

  10. 转:Socket原理与编程基础

    from: http://acm.tzc.edu.cn/acmhome/projectList.do?method=projectNewsDetail&nid=2 一.Socket简介 Soc ...

随机推荐

  1. 【Vue】树状节点接口 与 级联选择框组件

    原来有一个组织机构的渲染, 我自己写的我自己看也8太明白了: https://www.cnblogs.com/mindzone/p/14888046.html 现在,有一个位置选择,使用这个级联选择器 ...

  2. 【Tutorial C】04 基本输入输出

    输出单个字符 putchar('a'); // 字符输出函数,其功能是在终端(显示器)输出单个字符. putchar('\n'); // 支持转义换行 putchar(77); // 可以直接注入AS ...

  3. 【Java,IDEA】使用IDEA自动生成序列化ID

    一.设置序列化的原因: 详细见SE的IO流问题: https://www.cnblogs.com/mindzone/p/12752453.html 简单点理解就是对象的身份证号, 对于一些对象被序列之 ...

  4. 【Mybatis-Plus】06 代码生成器 CodeGenerator

    导入生成器需要的依赖坐标: <dependency> <groupId>com.baomidou</groupId> <artifactId>mybat ...

  5. 【转载】pip install 使用多个.local环境

    原文地址: https://zhuanlan.zhihu.com/p/351468170 ================================ 我们都知道anaconda可以安装不同的py ...

  6. 为什么大部分的 PHP 程序员转不了 Go 语言?

    大家好,我是码农先森. 树挪死,人挪活,这个需求我做不了,换个人吧.大家都有过这种经历吧,放在编程语言身上就是 PHP 不行了,赶紧转 Go 语言吧.那转 Go 语言就真的行了?那可不见得,我个人认为 ...

  7. OpenTiny HUICharts开源发布,带你了解一个简单、易上手的图表组件库

    摘要:目前 OpenTiny HUICharts 已经成功落地在华为内部100多个产品中,持续提升了用户的可视化体验. 本文分享自华为云社区<OpenTiny HUICharts 正式开源发布, ...

  8. Linux内核如何访问另外一个模块的函数和变量 原创

    一.问题整理 内核中两个模块,一个A,一个B,A模块中有操作函数,B模块要调用A模块的函数. 二.分析 这是一个驱动工程师经常遇到的一个问题,该问题其实是模块符号导出问题,实现该功能比较简单,借助EX ...

  9. LLM应用实战: 产业治理多标签分类

    1. 背景 许久未见,甚是想念~ 近期本qiang~换了工作,处于新业务适应期,因此文章有一段时间未更新,理解万岁! 现在正在着手的工作是产业治理方面,主要负责其中一个功能模块,即按照产业治理标准体系 ...

  10. React 高德地图 进京证 (二)

    上回书说到,躲开摄像头的基本功能实现了,但有三个核心问题: (1)速度慢 (2)距离远易失败 (3)地图限制 第一个问题:较为简单,把几千个摄像头按行政区划分好带上编号,在路线分段避让时按片儿计算,综 ...