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 动态拼接下拉框时,lay-verify"required" 失效了,有以下几种原因。 1. <form></form>标签 加入 layui 类,class"layui-form" 。提交按钮上加自动提交,lay-submit ""; 。需…...
VUE3+VITE简单的跨域代理配置
出于安全考虑,未设置前端白名单,前端开发时,需要配置代理。 在本地创建一个虚拟服务器,发送请求数据,同时接受请求的数据, 利用服务器与服务器间,交互,不会有跨域问题,也…...
Xdebug
1、开启xdebug扩展 2、修改一下php.ini文件 xdebug.remote_enable 1 xdebug.remote_autostart 13、vscode安装插件php debug 4、生成launch.json文件,好像啥都不用改 5、vscode没有配置php路径的,需要去配置: 6、发起请求 8、代码断…...
IDEA | SpringBoot 项目中使用 Apifox 上传接口
目录 1 安装 Apifox Helper 插件2 获取 Apifox 的 API 访问令牌3 IDEA 中设置 API 访问令牌4 IDEA 中上传接口5 常见问题5.1 如何自动设置目录名5.2 如何自动设置接口名5.3 如何更改上传位置 Apifox 官方指南: https://apifox.com/help/applications-and-p…...
列表分页返回对象
列表分页返回对象 仅针对于新项目,因为一般进入公司后项目都是已经搭建好的,只需要在原有框架基础上操作就可以了,但是遇到从0开始的项目并且还没有架构需要自己搭框架的时候就需要自己想办法找各种封装格式。 下面记录分页列表返回的封装格式…...
微软edge浏览器 v131.0.2903.99便携版
前言 Microsoft Edge浏览器是个新浏览器,它用起来很简单,界面也很清爽。这个浏览器功能特别多,里面还带了微软的小助手Contana,能帮用户做不少贴心的事儿。它支持安装各种小工具(插件),还能在网…...
Prometheus 专栏 —— Prometheus入门介绍
Prometheus 是? Prometheus 是一个开源的服务监控系统和时序数据库,主要用于收集、存储、查询和告警时间序列数据,这些数据通常反映了系统或者应用的状态或性能 Prometheus 的基本功能是? 数据采集数据存储数据查询告警通知 Prometheus 监控核心组件?…...
元宇宙在教育行业主要有哪些应用场景?
近两年来,元宇宙风潮在全球范围内迅速掀起了一股新的浪潮,“元宇宙”已成为各行各业探索新发展方向的热门话题,教育行业亦不例外。那么元宇宙在教育行业主要有哪些应用场景呢? 以下为主要适用场景: 课程实践ÿ…...
JZ31 栈的压入、弹出序列
题目来源:栈的压入、弹出序列_牛客题霸_牛客网 题目:如下 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序…...
电脑缺失libcurl.dll怎么解决?详解电脑libcurl.dll文件丢失问题
一、libcurl.dll文件丢失的原因 libcurl.dll是一个用于处理URL传输的库文件,广泛应用于各种基于网络的应用程序。当这个文件丢失时,可能会导致相关应用程序无法正常运行。以下是libcurl.dll文件丢失的一些常见原因: 软件安装或卸载不完整&a…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
