UEFI 概要

UEFI—hello world UEFI——hello world     包(以pkg结尾的文件夹)即package为包。是由一组模块(.工程文件.inf和源文件.c)和一个平台描述文件(.dsc)和包声明文件(.dec)组成的集合。inf文件用于自动编译源代码。 模块的可执行文件(.efi)可以像插件一样动态加载到UEFI内核中,本文主要讲述uefi编程常用的几种模块。 标准应用程序模块(DXE阶段或者shell阶段运行的应用程程序) #include <Uefi.h> 阅读详情

目录

支持的体系结构

MdeModulePkg

MdePkg

文件解析

每个模块是如何被编译城.efi文件的

AutoGen.c和AutoGen.h和如何生成的

标准应用程序模块执行的过程

_ModuleEntryPoint函数的主要作用

完整的驱动程序的框架

UEFI驱动模型

UEFI加载驱动的整个过程

编写UEFI驱动的步骤

Supported()函数要点

Start()函数要点

Stop()函数要点


支持的体系结构

体系结构可以是 IA32、X64、IPF、EBC、Mips、ARM 中的一个.

 

MdeModulePkg

这个包提供符合 UEFI/PI 行业标准的模块,还提供用于这些模块的定义(包括 PPI/Protocol/Guids 和 Library 类)和库实例。

Application/  Bus/  Core/  Include/  Library/  Logo/   Universal/

MdeModulePkg.dec 

MdeModulePkg.dsc 

MdeModulePkgExtra.uni 

MdeModulePkg.uni

MdePkg

Include/

Arm/      Ebc/     Ia32/  Ipf/               Mips/  X64/  AArch64/

Guid/  IndustryStandard/  Library/  Pi/   Protocol/   Ppi/      Uefi/  

Base.h   Base.h   PiMm.h   PiSmm.h  PiMm.h   PiSmm.h  PiMm.h   PiSmm.h

Library/

Base**/      Dxe**/   Pei**/    Smm**/   Uef**/

 

MdePkg.dec 

MdePkg.dsc 

MdePkgExtra.uni 

MdePkg.uni

模块开发环境包(MdePkg)是一个特殊的包,因为它是构建模块所需的最小基础设施。模块可能需要额外的包构建,但所有模块都基于 MdePkg。通过保持 MdePkg 非常稳定,它有效地成为一个模块或设备驱动程序工具包,用于构建可以与各种包一起工作的模块。

mdepkg 提供了所有定义(包括函数、宏、结构和库类)和库实例,这些在 mdepkg 中定义。最新的 mdepkg.chm 文件将记录这些定义,并可以在最新的udk发布中找到。

它还提供了 eFi1.10/uefi2.x/pi1.x 和其他行业标准的定义(包括 PPIS/协议/guids)。

mdepkg 支持构建一系列模块类型。mdepkg 可以单独使用,也可以与其他包结合使用来生成模块。 mdepkg 可以生成独立的模块,定义为只使用 mdepkg 中定义的类型为 BASE 的资源的 BASE。基本模块允许您编写可移植的 C 代码,这些 C 代码可以很容易地移植到任何环境中。mdepkg 可以用 C 代码来编写 SEC。mdepkg 包还可以生成符合 EFI1.10或 UEFI2.x 规范的 UEFI 驱动程序或 UEFI 应用程序。MDEFKG 还可以基于EDK II构建环境描述在EDK II 规格.

 

文件解析

*pkg模块

原数据文件(.inf文件)

原文件(.efi文件组成)

 
 dsc文件 用来编译一个Package

[Defines]:设置build相关的全局宏变量。这些变量要被.dsc文件的其他模块所引用

[LibraryClasses]:定义库的名字,以及库中的.inf文件,能够被其他模块所引用

[Components]:该区块内定义的模块会被build命令编译成对应的.efi文件

[BuildOptions]:列出本模块编译源文件时用到的编译选项,对所有模块的文件都有效

[PCD]:用于定义平台配置数据,目的在于不改动.inf文件和源文件的情况下完成对平台的配置。

 .dec文件 主要定义公开的数据和接口供其他模块使用

[Definces]:用于提供Package的名称,GUID和版本号等信息。

[Includes]:列出了Package所提供的头文件所在的目录。

[LibraryClasses]:用于明确库和头文件的对应关系。

[Guids]:Package/Include/Guid目录下面有很多文件,每个文件中定义了GUID号,这些号会被复制到对应的AutoGen.c中。

[Protocols]:Package/Include/Protocols目录下面有很多文件,每个文件中定义了Protocols号。

[Ppis]:用于定义源文件中用到的PPI(PPI是PEI阶段PEI模块之间的通信接口)

[PCD]:是.dsc文件中PCD块的补充。

[UserExtenssions]:

 

 

每个模块是如何被编译城.efi文件的

  1. 编译器将源文件编译成.obj文件
  2. 链接器将.obj文件和其他使用的库文件生成.dll文件
  3. GenFw工具将.dll文件转换成.efi文件
  4. GenFd命令将.efi文件最终生成.fd文件

 

AutoGen.c和AutoGen.h和如何生成的

  • 执行./build 命令后,解析模块的.inf文件然后生成AutoGen.c和AutoGen.h

 

标准应用程序模块执行的过程

  1. 将标准应用程序模块对应的.efi文件加载到内存,找到对应的StartImage文件
  2. 然后进入函数_ModuleEntryPoint函数
  3. 然后进入ProcessModuleEntryPointList
  4. 然后进入对应的模块的入口函数

 

_ModuleEntryPoint函数的主要作用

  • 初始化:初始化一些列的构造函数
  • 调用本模块的入口函数
  • 析构(执行解析构造函数)

 

完整的驱动程序的框架

  1. FindOut()找出对应的硬件设备
  2. Install()/Start()安装驱动到指定的设备控制器
  3. Uninstall/Stop()从硬件设备上卸载驱动


UEFI驱动模型

  • UEFI驱动模型的核心是通过EFI Driver Binding Protocol来管理驱动程序。
  • 完整的驱动程序包含两部分:EFI Driver Binding Protocol和驱动程序本身


UEFI加载驱动的整个过程

  1. 首先在Shell命令下使用load命令将驱动文件加载到内存,加载后UEFI后调用gBS->StartImage(...)执行DriverImage的入口函数,在入口函数里,Driver Binding Protocol被加载
  2. 到Handle(Driver Image Handle或者其他Controler Handle)上。然后遍历所有控制器为每个控制器调用CoreConnectSingleController函数,在CoreConnectSingleController中调用EDBP的Support函数测试是否支持这个驱动,如果支持责调用Start()函数进行安装。


编写UEFI驱动的步骤

  1. 编写硬件相关部分的驱动程序(驱动本身)
  2. 驱动框架部分,实现Driver Binding Protocol 的三个接口函数Supported() Start() Stop()函数

Supported()函数要点

  1. 忽略参数RemainingDeivePath
  2. 使用函数OpenProtocol()函数打开所需要的Protocol。标准的驱动要用EFI_OPEN_PROTOCOL_BY_DRIVER属性打开,如果要独占某个Protocol需要关闭所有使用该Protocol的驱动程序。然后用属性EFI_OPEN_PROTOCOL_BY_DRIVER|EFI_OPEN_PROTOCOL_EXCLUSIVE打开Protocol
  3. 如果上面出错,调用CloseProtocol()关闭所有已经打开的Protocol并返回错误码。
  4. 所需要的Protocol成功打开后,测试这个driver是否支持这个Controler,如果任意一项测试失败,调用CloseProtocol()函数挂比所有打开的Protocol,并返回EFI_UNSUPPORTED
  5. 测试成功,调用CloseProtocol()关闭所有已打开的Protocol
  6. 返回EFI_SUCCESS


Start()函数要点

  1. 忽略参数RemainingDeivePath
  2. 使用函数OpenProtocol()函数打开所需要的Protocol。标准的驱动要用EFI_OPEN_PROTOCOL_BY_DRIVER属性打开,如果要独占某个Protocol需要关闭所有使用该Protocol的驱动程序。然后用属性EFI_OPEN_PROTOCOL_BY_DRIVER|EFI_OPEN_PROTOCOL_EXCLUSIVE打开Protocol
  3. 如果上面出错,调用CloseProtocol()关闭所有已经打开的Protocol并返回错误码。
  4. 初始化Controler所指定的设备,如果有错误,则关闭所有打开的Protocol,返回EFI_DEVICE_ERROR
  5. 分配并初始化所用到的数据结构,数据结构包含Protocol相关的数据结构和其他 的私有的数据结构。如果分配资源的时候发生错误,就关闭所有已经打开的Protocol,释放已经得到的资源,EFI_OUT_OF_RESOURCE
  6. 用InstallMultipleProtocolInterface()安装驱动协议到 ControlerHandle,如果有错误,关闭所有打开的Protocol,并返回错误码
  7. 返回EFI_SUCCESS


Stop()函数要点

  1. 用UnInstallMultipleProtocolInterface()函数卸载所安装的Protocol
  2. 关闭所有已经打开的Protocol。
  3. 释放所有申请的资源

 

 

UEFI BIOS之PCD 这里说是大部分时间内,那是因为在诸如SEC阶段,以及PEI、DXE阶段的早期,某些PCD相关的模块还没有加载起来之前,这些类型的PCD还是不能访问的。需要注意的是上面的类型并不是在一个SPEC中定义的,前面的4中是满足EDKII规范,而最后一个满足的是PI规范,这个对使用的影响还不是很确定。因为该PCD是可以通过外部工具来修改的,那么有一点是可以肯定的,即它是可见的,通过查看BIOS二进制就可以找到。这里定义了PCD相关的两个变量,一个是值,注意它的类型修饰符是volatile,另一个是PCD的大小。 阅读详情

相关推荐

UEFI开发探索100 – 《UEFI编程实践》发布啦

(请保留-> 作者: 罗冰 https://blog.csdn.net/luobing4365) 《UEFI编程实践》发布1 内容简介第一部分 UEFI环境搭建及UEFI应用构建第1章 UEFI的世界第2章 UEFI开发和调试环境搭建第3章 构建UEFI应用第二部分 图形图像、汉字显示和GUI构建第4章 图形与汉字显示第5章 图像显示及特效第6章 GUI开发与移植第三部分 UEFI下访问各类总线设备第7章 UEFI环境下访问外设第8章 UEFI驱动与Option ROM第9章 UEFI与USB第1

7814

UEFI原理与编程第二章学习-UEFI标准应用工程模块文件介绍及编译流程

本文主要介绍了UEFI标准应用程序工程模块的入口函数、工程文件、编译和运行方法以及\.efi文件的加载过程

Vago的博客 4117

UEFI Drivers & UEFI Driver Model

1. UEFI Drivers UEFI Drivers是UEFI Image的一种,UEFI Drivers与UEFI Applications的区别: Objects managed by UEFI-based firmware: 对UEFI Drivers来说

1万+

UEFI知识积累

UEFI原理及编程知识点总结:第三章:*pkg:包含模块和和.dsc文件和.dec文件每个工程模块:原数据文件(.inf文件)和原文件(.efi文件组成)标准应用程序模块包含的部分:头文件(Uefi.h)和入口函数(默认的入口函数为UefiMain,可以在UefiMain.inf文件中指定)每个模块是如何被编译城.efi文件的:(1)编译器将源文件编译成.obj文件(2)链接器将.obj文件和其他...

太初有道 4853

UEFI架构

UEFI架构 UEFI提供系统化的标准方法,加载驱动并管理他们之间的交互。 前言:感谢uefi blog UEFI 提供了一个标准接口,以便在硬件发生变更时固件能提供足够信息而保证操作系统不受影响。它包含有芯片组和外设芯片驱动程序,并通过系统表提供引导时服务和运行时服务。 图一中展示了依赖于UEFI所提供的服务来工作的操作系统装载器(即 EFI OS Loader) 是如何启动操作系统内核...

Charles' home 5894

UEFI学习之初识BIOS与UEFI

UEFI提供给操作系统的接口包括启动服务(Boot Services,简称BS)和运行时服务(Runtime Service,简称RT)以及隐藏在BS之后的丰富Protocol。(3)扩展性能差,升级缓慢:BIOS代码采用静态链接,增加硬件功能时,必须将16位代码放置在0x0c0000~0x0fffff区间,初始化时将其设置为约定得中断处理程序。(4)UEFI系统的安全性:当系统的安全启动功能被打开后,UEFI在执行应用程序和驱动前会先检测程序和驱动证书,仅当证书被信任时才会被执行。

qq_45796887的博客 1794

UEFI原理与编程(二):UEFI工程模块文件-标准应用程序工程模块

UEFI 工程模块文件-标准应用程序工程模块

kaliopensourcextu 1万+

UEFI开发探索48 – 搭建UEFI Shell环境(启动盘及VirtualBox下UEFI Shell)

(请保留-> 作者: 罗冰) 做UEFI的实验,32位的程序可以使用TianoCore的模拟环境进行测试。64位的程序,可以使用启动盘在实际的机器上测试,也可以使用虚拟机来测试。 制作启动盘很简单,不过,我之前保存的启动文件丢失了,正好重新做一遍,把过程记录下来。 1制作UEFI BIOS下的启动盘 启动文件可以通过编译ShellPkg来得到。打开VS命令行,进入EDK的目录,执行...

6132

UEFI简介

前言大多数人接触UEFI都是在PC的应用场景上,有在PC上安装过多操作系统的经历的同学,通常会进入UEFI界面设置操作系统引导顺序、CPU虚拟化等设置。UEFI诞生之初也确实是作为BIOS的替代者,主要应用在PC电脑上。随着手机/平板等移动设备的发展,高通从MSM8998开始使用UEFI替代LK(Little Kernel)作为手机的Bootloader,作为一个嵌入式开...

内核工匠 1万+

UEFI Events

一、什么是Events Legacy post is Interrupt, EFI post is Event. Events 是UEFI Service管理的另一个类型的对像。一个Event可以被创建,也可以被销毁:它可以处在Waiting状态,也可以处在Signaled状态。 一个UEFI Image可以对Event做以下的事情: 1). 创建一个Event

7579

Linux驱动bootloader之UEFI系统二——再看UEFI

一、再识UEFI之前把UEFI 简单的理解为是一种Bootloader,其功能与LK类似,就是引导加载内核镜像程序,将整个系统launch起来,随着与UEFI 更多的接触,以及在网上查找资料,UEFI是由BIOS 演变而来,将会替代掉BIOS近 二十年的统治地位。UEFI: 可扩展固件接口(Extensible FirmwareInterface,EFI)是 Intel 为 PC 固件的体系结构、...

clam_zxf的博客 8511

【UEFI基础】UEFI Shell

【UEFI基础】UEFI Shell。

jiangwei0512的博客 3万+

mmia32.efi

官方centos-7.8.x86_64-EFI-BOOT-mmia32.efi

一文搞懂UEFI

UEFI是什么:概念UFEI用来干什么:应用UEFI有些什么东西:架构UEFI重点场景:启动UEFI学习资料:推荐通过这几个部分,咱们能一起搭建起一个关于UEFI简要知识框架。那么以后对哪些方面感兴趣,让我知道,咱们再一起学习一下,去继续丰富关于UEFI。话不多说,上菜!

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 5378

kali破解wifi之airmon-ng 工具利用

......

qq_42378173的博客 1万+

微带天线理论学习笔记(1)

微带天线的概念是由Deschamps于1953年提出来的,它是在一块厚度远小于工作波长的介质基片的一面敷以金属辐射片、一面全部敷以金属薄层作接地板而成。辐射片可以根据不同的要求设计成各种形状。微带天线具有质量轻、体积小和易于制造等优点,广泛应用于个人无线通信中。

qq_36521926的博客 6227

UEFI——获取UEFI MemoryMap

内存映射(Memory Mapping)是一种将文件内容映射到进程的虚拟地址空间的技术。在这种机制下,文件可以视为内存的一部分,从而允许程序直接对这部分内存进行读写操作,而无需传统的I/O调用。内存映射缓冲区利用虚拟内存机制,让操作系统将一部分磁盘文件映射到进程地址空间的一块连续区域当中。操作系统负责管理内存页的加载和卸载,应用程序只需要访问这块内存区域即可,从而避免了频繁的磁盘I/O操作和多余的系统调用。

蟹蟹泥的博客 2530

纯JS实现SM3加密算法(兼容IE浏览器)

纯JS实现SM3加密,IE、谷歌、火狐等浏览器可以直接使用。

qianpou的博客 7354

【UEFI基础】UEFI启动介绍及UEFI开发基础

UEFI技术概述 UEFI(统一可扩展固件接口)是替代传统BIOS的新一代固件标准,包含SEC、PEI、DXE等启动阶段。其核心数据结构System Table提供启动服务、运行时服务和配置表等重要功能。UEFI通过OS Installer创建启动分区并安装OS Loader,后者负责加载操作系统内核并完成控制权交接。UEFI环境包含应用、驱动和库三类组件:应用执行特定功能(如OS安装),驱动管理硬件设备,库提供通用功能支持。这种模块化设计实现了硬件初始化、系统启动和操作系统加载的标准化流程。

yao00037的博客 1141

海康工业相机触发模式详解:软触发 vs 外触发,在C#里如何选与用?

本文深入解析海康工业相机的软触发与外触发模式,详细比较两者的特性差异、适用场景及C#实现方法。通过海康SDK配置指南和实战代码示例,帮助开发者掌握工业相机触发模式的选择与优化技巧,提升自动化检测系统的精确性和可靠性。

weixin_42635064的博客 556

跨境电商ERP开发之Shopee开发者账号申请

引言:由于电子信息技术和经济全球化的进一步发展,电子商务在国际贸易中的影响力和关键作用日渐突显,已变成中国出口贸易的市场趋势。跨境电商未来的发展前景必定是有助于减少经济成本、推动全球贸易便利化,有助于提高国内群众福祉,有助于打造良好的营商环境,从而推动经济长期健康发展。 gitee仓库地址: https://gitee.com/naturalwish/SSERP/tree/master 以下授权教学同ShopeeOpen Platform - Developer Guide 申请流程 ..

naturalwish的专栏 3640

UEFI 详解

UEFI 是什么? UEFI - Unified Extensible Firmware Interface 统一可扩展固件接口 从规范的角度来看,它是一个规范,定义了计算机操作系统和平台固件之间的接口规范. 从实体的角度来讲,BIOS 和 UEFI 是两种不同类型的计算机固件(什么是固件?就是固化在计算机主板上某个非易失存储区(EEPROM)中的小系统),计算机启动都是先启动它,然后加载...

lxm920714的专栏 5833

《QGIS快速入门与应用基础》230:添加图例工具

本文系统讲解QGIS图例制作的核心方法与优化技巧。首先强调图例与地图框的绑定逻辑,提出三种绑定状态及适用场景。详细拆解三种图例添加方法:布局工具栏一键添加法(新手首选)、菜单栏添加法和右键快捷创建法,并给出单地图框和多地图框两种典型场景的规范技巧。重点解决新手常见的图例杂乱、样式不规范、内容脱节等问题,帮助用户从基础图例制作进阶到符合行业标准的专业图例设计。通过分步操作图示和实用技巧,使读者能够快速掌握图例创建的核心流程与优化方法。

LuckyHanMo的博客 550

x86 Legacy BIOS、IA32 UEFI、x86_64 UEFI 和 ARM64 UEFI 模式

(基本输入输出系统)是较早期计算机的启动方式,也是大多数老旧计算机使用的启动模式。它基于传统的16位架构,因此对硬件的支持和操作系统的启动方式有一些限制。UEFI(统一可扩展固件接口)是现代计算机系统所采用的启动标准,旨在取代传统的BIOS。它支持更先进的功能和更高的灵活性。IA32 UEFI 是专门为32位 x86 架构设计的UEFI启动模式。是为64位的x86架构(如Intel和AMD的现代处理器)设计的UEFI启动模式。它比32位UEFI更适合处理现代计算机的高性能需求。ARM64 UEFI。

宋发元 2458

simulink的Sine Wave 模块详解

模块是 Simulink 中的一个信号源模块,用于生成正弦波信号。该模块可以根据设定的幅值、频率、相位和偏移量,在仿真过程中产生周期性的正弦波形。模块都能提供强有力的支持。通过深入了解其参数的影响及结合 MATLAB 脚本的应用,读者可以更加有效地利用这一模块进行仿真和研究。此外,通过实际应用场景的扩展以及常见问题解答部分的帮助,能够更好地掌握。模块是一个非常实用的工具,适用于需要生成正弦波信号的各种场景。模块的参数,可以进一步增强学习体验。模块参数的影响,下面我们将详细探讨每个参数如何影响仿真结果。

xiaoheshang_123的博客 1052

从 AccessControl.authorizationCheck 读懂 ABAP CDS 访问控制:默认策略、取舍边界与一线项目实战

摘要: 本文深入解析ABAP CDS视图中@AccessControl.authorizationCheck注解的核心功能与工程实践。该注解通过DCL角色实现行级数据过滤,提供三类能力:控制访问生效条件、约束语义一致性及管理特权访问。文章详述四种注解取值(#CHECK、#NOT_REQUIRED、#NOT_ALLOWED、#PRIVILEGED_ONLY)的适用场景与默认行为,并结合采购订单案例演示DCL与PFCG授权的落地步骤。同时指出访问控制的边界问题(如JOIN场景可能绕过过滤),并给出视图层级决策矩

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 261
上一篇: 页表管理及多级页表
下一篇: UEFI中PEI阶段概总
Life_Maze
博客等级 码龄10年 2251粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值