一、概述
二、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返回值: