UEFI Protocol

news/2024/9/22 12:38:37/

一、概述

在这里插入图片描述

二、Protocol的定义

1、Protocol是服务器端和客户端之间的一种约定,在软件编程上称为接口,服务器端和客户端通过这个约定信息的互通。
2、服务器端和客户端在UEFI中都是可执行的二进制文件。
3、为了实现这些二进制文件之间的互通,模块双方共同使Protocol进行双方的交互。

三、Protocol的作用

1、UEFI的中文含义是“ 可扩展固件接口”,所谓可扩展的含义就是可以在系统完成后(编译为binary)之后,再次为系统增加新的功能,而不用重新rebuild整个系统。

2、为了支持不同二进制组件运行时相互通信,不同组件可以相互调用之间的功能,同时各个组件相互之间调用时的统一编程接口以便方便组件厂商对于组件的开发等要求。Protocol用以实现这些功能的同时满足服务器端和客户端之间的通信。
在这里插入图片描述

三、Protocol的组成

举个例子:

struct _EFI_BLOCK_IO_PROTOCOL {UINT64              Revision;  //必须保证向后兼容的Protocol版本号 EFI_BLOCK_IO_MEDIA  *Media; //指针指向这个设备EFI_BLOCK_RESET     Reset;  //重置复位信号EFI_BLOCK_READ      ReadBlocks;  //读Protocol服务EFI_BLOCK_WRITE     WriteBlocks;  //写Protocol服务EFI_BLOCK_FLUSH     FlushBlocks;  //清除缓存服务};extern EFI_GUID gEfiBlockIoProtocolGuid;  //导出该Protocol

Protocol组成图:

在这里插入图片描述

四、Protocol的使用:

在这里插入图片描述

Protocol的使用:

第一步:通过gBS->OpenProtocol(或者HandleProtocol、LocateProtocol)找出Protocol的对象。
第二步:使用这个Protocol提供的服务。
第三步:通过gBS->CloseProtocol关闭打开的Protocol。

Protocol使用简介:

在这里插入图片描述

OpenProtocol函数原型:

在这里插入图片描述

// HandleProtocol:简化的OpenProtocoltypedef EFI_STATUS(EFIAPI *EFI_HANDLE_PROTOCOL)
{
IN EFI_HANDLE Handle, 	//指定的HANDLE,查询并安装
IN EFI_GUID *Prontocol, 	//要打开的Protocol(指向该Protocol GUID的指针)
OUT VOID **Interface, OPTIONAL 	//返回打开的对象
};// HandleProtocol的实现EFI_STATUS
HandleProtocol(
IN EFI_HANDLE Handle,
IN EFI_GUID *Prontocol, 
OUT VOID **Interface, OPTIONAL )
{
return OpenProcol (
Handle,
Protocol,
Interface,
EfiCoreImageHandle,
Null,
EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL
);
}

HandleProtocol返回值:

在这里插入图片描述

// LocateProtocol:USER定位Protocol的第一个实例
typedef EFI_STATUS(EFIAPI *EFI_LOCATE_PROTOCOL)
{
IN EFI_GUID *Protocol, //带查询的Protocol
IN VOID *Registration,OPTIONAL //可选参数,从RegisterProtocolNotify()获得key
OUT VOID **Interface //返回第一个匹配到的实例
}// LocateHandleBuffer:支持某个Protocol的所以设备
typdef EFI_STATUS(EFIAPI* EFI_LOCATE_HANDLE_BUFFER)
{
IN EFI_LOCATE_SEARCH_TYPE SearchType, //查找方式函数有三种SearchType:1.AllHandles用于找到系统中的所有Handle;2.ByRegisterNotify用于在RegisterNotify中找出匹配SearchKey的Handle;3.ByProtocol用于从系统Handle数据库中找到支持指定Protocol的Handle。
IN EFI_GID *Protocol OPTIONAL, //指定的Protocol
IN VOID *Searchkey , //PROTOCOL_NOTIFY的类型
IN OUT UINT *NoHandle, //返回数量
OUT EFI_HANDLE *Buffer //分配Handle数组并返回
}

LocateProtocol返回值:

在这里插入图片描述

LocateHandleBuffer返回值:

在这里插入图片描述
在这里插入图片描述

参考文献:《UEFI原理与编程》戴正华著。


http://www.ppmy.cn/news/40390.html

相关文章

远程管理服务器 用户组创建 1(运维笔记)

远程管理服务器 用户组创建 1(运维笔记) 修改跳板机名称: [rootRKUN18 ~]# vim /etc/sysconfig/network [rootRKUN18 ~]# cat /etc/sysconfig/network # Created by anaconda HOSTNAMEjumper-server修改跳板机网络模式为仅主机模式,ssh连接…

动力节点王鹤SpringBoot3笔记——第七章 视图技术Thymeleaf

目录 第七章 视图技术Thymeleaf 前言 7.1 表达式 7.2 if-for 第七章 视图技术Thymeleaf 前言 Thymeleaf 是一个表现层的模板引擎, 一般被使用在 Web 环境中,它可以处理 HTML, XML、 JS 等文档,简单来说,它可以将 JSP 作…

蓝牙耳机哪个品牌好用又便宜?2023便宜耐用的蓝牙耳机推荐

随着蓝牙耳机的受欢迎程度越来越高,其更迭速度也越来越快,各种品牌的蓝牙耳机出现在大众视野。下面,我来给大家分享几款便宜耐用的蓝牙耳机,都极具性价比,一起来看看吧。 一、南卡小音舱Lite2蓝牙耳机 参考价&#xf…

thinkphp之超级无限分类 10行代码

效果图 代码 static public $treeList array(); //存放无限分类结果如果一页面有多个无限分类可以使用 Tool::$treeList array(); 清空/*** 无限级分类* access public * param Array $data //数据库里获取的结果集 * param Int $pid * param Int $count …

Vue3通透教程【十】跨级组件通讯—依赖注入

文章目录🌟 写在前面🌟 provide函数🌟 inject 函数🌟 跨组件通讯🌟 写在最后🌟 写在前面 专栏介绍: 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 Vue3 的相…

区块链 -> 区块链简介

文章目录区块链结合去中心化后组成的数据库有什么特点?区块链能干什么?区块链实际是一种数据库。 不同于我们的MySQL数据库,区块链是一种分布式数据库。 腾讯:Tencent Distributed SQL,简称 TDSQL。阿里:PolarDB PostgreSQL,简称PolarDB-PG。 区块链…

[SpringBoot系列] 定时任务

假设我们已经搭建好了一个基于Spring Boot项目,首先我们要在Application中设置启用定时任务功能EnableScheduling 启动定时任务 package com.scheduling; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.Spr…

掌握这些技巧,轻松在Facebook上实现SEO

Facebook是世界上最大的社交网络之一,每天有数亿用户在上面交流,分享内容和互动。随着越来越多的企业开始使用Facebook来进行品牌推广和营销活动,如何在Facebook上实现SEO已经成为了一个非常重要的话题。 本文将为您介绍一些在Facebook上实现…