当前位置: 首页 > 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…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...