UEFI Protocol

一、概述

在这里插入图片描述

二、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:简化的OpenProtocol

typedef 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原理与编程》戴正华著。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值