UEFI学习笔记(三)
UEFI中的Protocol
Protocol在UEFI内核中的表示
每个设备就是一个EFI_HANDLE;
所有的HANDLE通过AllHandles链接起来;
IHANDLE的Protocols是双向链表,每个元素都是PROTOCOL_INTERFACE;
通过PROTOCOL_INTERFACE中的Protocol指针可以得到GUID;
如下图:
如何使用Ptorocol服务
使用Protocol的三个步骤:
- gBS->OpenProtocol (或者HandleProtocol、LocateProtocol) 找出Protocol对象
- 使用这个Protocol提供的服务
- gBS->CloseProtocol 关闭Protocol
- 如果想知道某个Protocol被哪些设备打开了,可以使用OpenProtocolInformation服务
OpenProtocol服务
用于查询指定的Handle中是否支持指定的Protocol,如果支持则打开该Protocol,不支持则返回错误码
HandleProtocol服务
OpenProtocol使用起来比较复杂,参数较多,如果开发者只想通过Protocol的GUID得到Protocol对象,启动服务提供HandleProtocol以简化打开Protocol。HandleProtocol就是OpenProtocol的简化版
LocateProtocol服务
从UEFI内核中找出指定Protocol的第一个实例
LocateHandleBuffer服务
上面的服务是从设备上找出Protocol,这个服务是找出系统中所有安装了Protocol的设备,系统分配内存,调用者释放内存;
LocateHandle也是一样的功能,区别是需要调用者负责分配和释放内存
ProtocolPerHandle服务
用于获取指定设备所支持的所有Protocol
OpenProtocolInformation服务
用于获取指定设备上指定Protocol的打开信息
CloseProtocol服务
Protocol使用完之后要关闭