当前位置: 首页 > news >正文

UEFI Spec 学习笔记---4 - EFI System Table(1)

4 - EFI System Table

本章节主要介绍的是 UEFI Image 的 Entry point(在 UEFI 固件执行的时候,都是直接调用入口函数并且执行从而调用其他的 driver)。

UEFI Image 主要是有三类:UEFI boot service driver、UEFI runtime driver 以及 UEFI application.三种 UEFI image 的 entry point 没有什么区别。

4.1 UEFI Image Entry Point

  • 传递给映像的最重要的参数是指向系统表的指针。这个指针是EFI_IMAGE_ENTRY_POINT(见下面的定义),是UEFI映像的主要Entry Point。系统表包含指向活动控制台设备的指针、指向引导服务表的指针、指向运行时服务表的指针,以及指向系统配置表(如ACPI、SMBIOS和SAL系统表)列表的指针。

EFI_IMAGE_ENTRY_POINT :这是UEFI映像的主要入口点。这个入口点对于UEFI应用程序和UEFI驱动程序是相同的。

typedef
EFI_STATUS
(EFIAPI *EFI_IMAGE_ENTRY_POINT) (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
);

参数:

  • ImageHandle:image 的 Hanle,是由固件分配的
  • SystemTable:指向 system table 的指针

这个函数是一个EFl图像的入口点。EFI映像通过EFI引导服务EFI_BOOT_SERVICES.LoadImage()加载并重新定位到系统内存中。。EFI映像是通过EFI引导服务EFI_BOOT_SERVICES.StartImage()调用的。系统表包含标准输出和输入句柄,以及指向EFI_BOOT_SERVICES和EFI_RUNTIME_SERVICES表的指针。服务表包含固件中的入口点,用于访问核心EFI系统功能。

系统表中的句柄用于获得对控制台的基本访问。此外,系统表中还包含了指向其他标准表的指针,如果相关指针被初始化为非零值,则加载映像可以使用这些指针。这些表的例子有ACPI、SMBIOS、SAL系统表等。

ImageHandle 可以看作是一个 driver 的标识符,每个 driver 的 handle 是唯一的,我们可以通过 EFI_INSTALL_PROTOCOL_INTERFACE 在 handle 上安装多个该 driver 需要调用的 protocol .

4.2 EFI Table Header

EFI_TABLE_HEADER数据类型是位于所有标准EFI表类型之前的数据结构。它包括每个表类型的唯一签名,table 的修订版,可以在向EFI表类型添加扩展时更新,以及一个32位的CRC,以便EFI表类型的使用者可以验证EFI表的内容,确认 table 是否被修改。

typedef struct {////// A 64-bit signature that identifies the type of table that follows./// Unique signatures have been generated for the EFI System Table,/// the EFI Boot Services Table, and the EFI Runtime Services Table.///UINT64    Signature;////// The revision of the EFI Specification to which this table/// conforms. The upper 16 bits of this field contain the major/// revision value, and the lower 16 bits contain the minor revision/// value. The minor revision values are limited to the range of 00..99.///UINT32    Revision;////// The size, in bytes, of the entire table including the EFI_TABLE_HEADER.///UINT32    HeaderSize;////// The 32-bit CRC for the entire table. This value is computed by/// setting this field to 0, and computing the 32-bit CRC for HeaderSize bytes.///UINT32    CRC32;////// Reserved field that must be set to 0.///UINT32    Reserved;
} EFI_TABLE_HEADER;

4.3 EFI System Table

UEFI使用EFI系统表,其中包含指向运行时和启动服务表的指针。

ExitBootServices()调用之前 EFI系统表的所有字段都有效。在操作系统通过调用ExitBootServices()控制平台之后,只有Hdr, FirmwareVendor, FirmwareRevision, RuntimeServices, NumberOfTableEntries和ConfigurationTable字段有效。

typedef struct {////// The table header for the EFI System Table.///EFI_TABLE_HEADER                   Hdr;////// A pointer to a null terminated string that identifies the vendor/// that produces the system firmware for the platform.///CHAR16                             *FirmwareVendor;////// A firmware vendor specific value that identifies the revision/// of the system firmware for the platform.///UINT32                             FirmwareRevision;////// The handle for the active console input device. This handle must support/// EFI_SIMPLE_TEXT_INPUT_PROTOCOL and EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL.///EFI_HANDLE                         ConsoleInHandle;////// A pointer to the EFI_SIMPLE_TEXT_INPUT_PROTOCOL interface that is/// associated with ConsoleInHandle.///EFI_SIMPLE_TEXT_INPUT_PROTOCOL     *ConIn;////// The handle for the active console output device.///EFI_HANDLE                         ConsoleOutHandle;////// A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface/// that is associated with ConsoleOutHandle.///EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *ConOut;////// The handle for the active standard error console device./// This handle must support the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.///EFI_HANDLE                         StandardErrorHandle;////// A pointer to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL interface/// that is associated with StandardErrorHandle.///EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL    *StdErr;////// A pointer to the EFI Runtime Services Table.///EFI_RUNTIME_SERVICES               *RuntimeServices;////// A pointer to the EFI Boot Services Table.///EFI_BOOT_SERVICES                  *BootServices;////// The number of system configuration tables in the buffer ConfigurationTable.///UINTN                              NumberOfTableEntries;////// A pointer to the system configuration tables./// The number of entries in the table is NumberOfTableEntries.///EFI_CONFIGURATION_TABLE            *ConfigurationTable;
} EFI_SYSTEM_TABLE;

4.4 EFI Boot Services Table

UEFI使用EFI引导服务表,其中包含表头和指向所有引导服务的指针。这个表的定义如下面的代码片段所示。除了表头之外,EFI引导服务表中的所有元素都是函数指针的原型,指向第7节中定义的函数。在操作系统通过调用EFI_BOOT_SERVICES.ExitBootServices()控制平台之后,该表中的函数指针将失效。

///
/// EFI Boot Services Table.
///
typedef struct {////// The table header for the EFI Boot Services Table.///EFI_TABLE_HEADER                              Hdr;//// Task Priority Services//EFI_RAISE_TPL                                 RaiseTPL;EFI_RESTORE_TPL                               RestoreTPL;//// Memory Services//EFI_ALLOCATE_PAGES                            AllocatePages;EFI_FREE_PAGES                                FreePages;EFI_GET_MEMORY_MAP                            GetMemoryMap;EFI_ALLOCATE_POOL                             AllocatePool;EFI_FREE_POOL                                 FreePool;//// Event & Timer Services//EFI_CREATE_EVENT                              CreateEvent;EFI_SET_TIMER                                 SetTimer;EFI_WAIT_FOR_EVENT                            WaitForEvent;EFI_SIGNAL_EVENT                              SignalEvent;EFI_CLOSE_EVENT                               CloseEvent;EFI_CHECK_EVENT                               CheckEvent;//// Protocol Handler Services//EFI_INSTALL_PROTOCOL_INTERFACE                InstallProtocolInterface;EFI_REINSTALL_PROTOCOL_INTERFACE              ReinstallProtocolInterface;EFI_UNINSTALL_PROTOCOL_INTERFACE              UninstallProtocolInterface;EFI_HANDLE_PROTOCOL                           HandleProtocol;VOID                                          *Reserved;EFI_REGISTER_PROTOCOL_NOTIFY                  RegisterProtocolNotify;EFI_LOCATE_HANDLE                             LocateHandle;EFI_LOCATE_DEVICE_PATH                        LocateDevicePath;EFI_INSTALL_CONFIGURATION_TABLE               InstallConfigurationTable;//// Image Services//EFI_IMAGE_LOAD                                LoadImage;EFI_IMAGE_START                               StartImage;EFI_EXIT                                      Exit;EFI_IMAGE_UNLOAD                              UnloadImage;EFI_EXIT_BOOT_SERVICES                        ExitBootServices;//// Miscellaneous Services//EFI_GET_NEXT_MONOTONIC_COUNT                  GetNextMonotonicCount;EFI_STALL                                     Stall;EFI_SET_WATCHDOG_TIMER                        SetWatchdogTimer;//// DriverSupport Services//EFI_CONNECT_CONTROLLER                        ConnectController;EFI_DISCONNECT_CONTROLLER                     DisconnectController;//// Open and Close Protocol Services//EFI_OPEN_PROTOCOL                             OpenProtocol;EFI_CLOSE_PROTOCOL                            CloseProtocol;EFI_OPEN_PROTOCOL_INFORMATION                 OpenProtocolInformation;//// Library Services//EFI_PROTOCOLS_PER_HANDLE                      ProtocolsPerHandle;EFI_LOCATE_HANDLE_BUFFER                      LocateHandleBuffer;EFI_LOCATE_PROTOCOL                           LocateProtocol;EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES      InstallMultipleProtocolInterfaces;EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES    UninstallMultipleProtocolInterfaces;//// 32-bit CRC Services//EFI_CALCULATE_CRC32                           CalculateCrc32;//// Miscellaneous Services//EFI_COPY_MEM                                  CopyMem;EFI_SET_MEM                                   SetMem;EFI_CREATE_EVENT_EX                           CreateEventEx;
} EFI_BOOT_SERVICES;

4.5 EFI Runtime Services Table

UEFI使用EFI运行时服务表,它包含一个表头和指向所有运行时服务的指针。这个表的定义如下面的代码片段所示。除了表头之外,EFI Runtime Services Tables中的所有元素都是函数指针的原型,指向第8节中定义的函数。与EFI启动服务表不同,这个表和它包含的函数指针在UEFI操作系统加载程序和操作系统通过调用EFI_BOOT_SERVICES.ExitBootServices()控制平台后有效。如果操作系统调用SetVirtualAddressMap(),则该表中的函数指针将固定到指向新的虚拟映射入口点。

///
/// EFI Runtime Services Table.
///
typedef struct {////// The table header for the EFI Runtime Services Table.///EFI_TABLE_HEADER                  Hdr;//// Time Services//EFI_GET_TIME                      GetTime;EFI_SET_TIME                      SetTime;EFI_GET_WAKEUP_TIME               GetWakeupTime;EFI_SET_WAKEUP_TIME               SetWakeupTime;//// Virtual Memory Services//EFI_SET_VIRTUAL_ADDRESS_MAP       SetVirtualAddressMap;EFI_CONVERT_POINTER               ConvertPointer;//// Variable Services//EFI_GET_VARIABLE                  GetVariable;EFI_GET_NEXT_VARIABLE_NAME        GetNextVariableName;EFI_SET_VARIABLE                  SetVariable;//// Miscellaneous Services//EFI_GET_NEXT_HIGH_MONO_COUNT      GetNextHighMonotonicCount;EFI_RESET_SYSTEM                  ResetSystem;//// UEFI 2.0 Capsule Services//EFI_UPDATE_CAPSULE                UpdateCapsule;EFI_QUERY_CAPSULE_CAPABILITIES    QueryCapsuleCapabilities;//// Miscellaneous UEFI 2.0 Service//EFI_QUERY_VARIABLE_INFO           QueryVariableInfo;
} EFI_RUNTIME_SERVICES;

4.6 EFI Configuration Table & Properties Table

EFI配置表是EFI系统表中的ConfigurationTable字段。该表包含一组GUID/指针对。该表的每个元素都由下面的EFI_CONFIGURATION_TABLE结构描述。配置表类型的数量预计会随着时间的推移而增加。这就是为什么使用GUID来标识配置表类型的原因。EFI配置表每种表类型最多只能包含一个实例。

///
/// Contains a set of GUID/pointer pairs comprised of the ConfigurationTable field in the
/// EFI System Table.
///
typedef struct {////// The 128-bit GUID value that uniquely identifies the system configuration table.///EFI_GUID    VendorGuid;////// A pointer to the table associated with VendorGuid.///VOID        *VendorTable;
} EFI_CONFIGURATION_TABLE;

相关文章:

UEFI Spec 学习笔记---4 - EFI System Table(1)

4 - EFI System Table 本章节主要介绍的是 UEFI Image 的 Entry point(在 UEFI 固件执行的时候,都是直接调用入口函数并且执行从而调用其他的 driver)。 UEFI Image 主要是有三类:UEFI boot service driver、UEFI runtime drive…...

【微信小程序】3|首页搜索框 | 我的咖啡店-综合实训

首页-搜索框-跳转 引言 在微信小程序中,首页的搜索框是用户交互的重要入口。本文将通过“我的咖啡店”小程序的首页搜索框实现,详细介绍如何在微信小程序中创建和处理搜索框的交互。 1. 搜索函数实现 onClickInput函数在用户点击搜索框时触发&#x…...

独一无二,万字详谈——Linux之文件管理

Linux文件部分的学习,有这一篇的博客足矣! 目录 一、文件的命名规则 1、可以使用哪些字符? 2、文件名的长度 3、Linux文件名的大小写 4、Linux文件扩展名 二、文件管理命令 1、目录的创建/删除 (1)、目录的创建 ① mkdir…...

React:前端开发领域的璀璨之星

亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...

C/C++ 数据结构与算法【哈夫曼树】 哈夫曼树详细解析【日常学习,考研必备】带图+详细代码

哈夫曼树(最优二叉树) 1)基础概念 **路径:**从树中一个结点到另一个结点之间的分支构成这两个结点间的路径。 **结点的路径长度:**两结点间路径上的分支数。 **树的路径长度:**从树根到每一个结点的路径…...

基于NodeMCU的物联网窗帘控制系统设计

最终效果 基于NodeMCU的物联网窗帘控制系统设计 项目介绍 该项目是“物联网实验室监测控制系统设计(仿智能家居)”项目中的“家电控制设计”中的“窗帘控制”子项目,最前者还包括“物联网设计”、“环境监测设计”、“门禁系统设计计”和“小…...

喜报 | 擎创科技入围上海市优秀信创解决方案

近日,由上海市经信委组织的“2024年上海市优秀信创解决方案”征集遴选活动圆满落幕,擎创科技凭借实践经验优秀的《擎创夏洛克智能预警与应急处置解决方案》成功入选“2024年上海市优秀信创解决方案”名单。 为激发创新活力,发挥标杆作用&…...

windows10下使用沙盒多开uiautoanimation可行性验证

文章目录 ⭐前言⭐sandboxie下载使用⭐pyinstaller打包python的uiautoanimation成exe⭐结论⭐结束 ⭐前言 大家好,我是yma16,本文分享windows下使用沙盒多开uiautoanimation可行性验证。 背景 实现多开应用程序从而进行自动化控制,批量处理大…...

电脑报错wsdprintproxy.dll丢失?修复wsdprintproxy.dll文件缺失的实用方法

在使用电脑的过程中,我们可能会遇到各种各样的错误提示,其中之一就是系统提示wsdprintproxy.dll文件丢失。这个DLL文件是Windows操作系统中的一个重要组件,它通常与Windows的打印功能相关。当这个文件丢失或损坏时,可能会导致打印…...

Kubernetes 的资源管理方式

集群架构 Docker 是每一个节点(包括 Master 节点和 Node 节点)的运行时环境。 kubelet 负责控制所有容器的启动和停止等,保证每个节点(包括 Master 节点和 Node 节点)正常工作,并且帮助 Node 节点和 Maste…...

layui动态拼接生成下拉框验证必填项失效问题

利用 jQuery 动态拼接下拉框时&#xff0c;lay-verify"required" 失效了&#xff0c;有以下几种原因。 1. <form></form>标签 加入 layui 类&#xff0c;class"layui-form" 。提交按钮上加自动提交&#xff0c;lay-submit ""; 。需…...

VUE3+VITE简单的跨域代理配置

出于安全考虑&#xff0c;未设置前端白名单&#xff0c;前端开发时&#xff0c;需要配置代理。 在本地创建一个虚拟服务器&#xff0c;发送请求数据&#xff0c;同时接受请求的数据&#xff0c; 利用服务器与服务器间&#xff0c;交互&#xff0c;不会有跨域问题&#xff0c;也…...

Xdebug

1、开启xdebug扩展 2、修改一下php.ini文件 xdebug.remote_enable 1 xdebug.remote_autostart 13、vscode安装插件php debug 4、生成launch.json文件&#xff0c;好像啥都不用改 5、vscode没有配置php路径的&#xff0c;需要去配置&#xff1a; 6、发起请求 8、代码断…...

IDEA | SpringBoot 项目中使用 Apifox 上传接口

目录 1 安装 Apifox Helper 插件2 获取 Apifox 的 API 访问令牌3 IDEA 中设置 API 访问令牌4 IDEA 中上传接口5 常见问题5.1 如何自动设置目录名5.2 如何自动设置接口名5.3 如何更改上传位置 Apifox 官方指南&#xff1a; https://apifox.com/help/applications-and-p…...

列表分页返回对象

列表分页返回对象 仅针对于新项目&#xff0c;因为一般进入公司后项目都是已经搭建好的&#xff0c;只需要在原有框架基础上操作就可以了&#xff0c;但是遇到从0开始的项目并且还没有架构需要自己搭框架的时候就需要自己想办法找各种封装格式。 下面记录分页列表返回的封装格式…...

微软edge浏览器 v131.0.2903.99便携版

前言 Microsoft Edge浏览器是个新浏览器&#xff0c;它用起来很简单&#xff0c;界面也很清爽。这个浏览器功能特别多&#xff0c;里面还带了微软的小助手Contana&#xff0c;能帮用户做不少贴心的事儿。它支持安装各种小工具&#xff08;插件&#xff09;&#xff0c;还能在网…...

Prometheus 专栏 —— Prometheus入门介绍

Prometheus 是? Prometheus 是一个开源的服务监控系统和时序数据库&#xff0c;主要用于收集、存储、查询和告警时间序列数据&#xff0c;这些数据通常反映了系统或者应用的状态或性能 Prometheus 的基本功能是? 数据采集数据存储数据查询告警通知 Prometheus 监控核心组件?…...

元宇宙在教育行业主要有哪些应用场景?

近两年来&#xff0c;元宇宙风潮在全球范围内迅速掀起了一股新的浪潮&#xff0c;“元宇宙”已成为各行各业探索新发展方向的热门话题&#xff0c;教育行业亦不例外。那么元宇宙在教育行业主要有哪些应用场景呢&#xff1f; 以下为主要适用场景&#xff1a; 课程实践&#xff…...

JZ31 栈的压入、弹出序列

题目来源&#xff1a;栈的压入、弹出序列_牛客题霸_牛客网 题目&#xff1a;如下 输入两个整数序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序&#xf…...

电脑缺失libcurl.dll怎么解决?详解电脑libcurl.dll文件丢失问题

一、libcurl.dll文件丢失的原因 libcurl.dll是一个用于处理URL传输的库文件&#xff0c;广泛应用于各种基于网络的应用程序。当这个文件丢失时&#xff0c;可能会导致相关应用程序无法正常运行。以下是libcurl.dll文件丢失的一些常见原因&#xff1a; 软件安装或卸载不完整&a…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...