UEFI环境中调用HandleProtocol后是否需要调用FreePool?
关于EFI_BOOT_SERVICES.HandleProtocol()的内存清理问题
首先给出EFI_HANDLE_PROTOCOL的函数定义:
typedef EFI_STATUS (EFIAPI *EFI_HANDLE_PROTOCOL) ( IN EFI_HANDLE Handle, IN EFI_GUID *Protocol, OUT VOID **Interface );
核心问题解答
- 调用
HandleProtocol后不需要调用FreePool释放Interface指向的内存。 - 内存性质:
Interface返回的是指向已存在的协议实例的直接指针,这块内存并非通过EFI_BOOT_SERVICES.AllocatePool等接口分配的临时池内存,而是由安装该协议的驱动/系统组件预先分配并维护的常驻内存。 - 清理责任:只有当安装该协议的驱动被卸载,或者对应的EFI Handle被销毁时,这块内存才会由负责安装它的组件进行清理,调用
HandleProtocol的一方完全不需要手动处理内存释放。
和OpenProtocol的区别
UEFI规范建议用OpenProtocol替代HandleProtocol,其中OpenProtocol在部分场景下会返回需要调用方自行释放的内存,但HandleProtocol的设计逻辑是直接返回系统中已存在的协议实例指针,因此不存在调用方释放内存的义务。
内容的提问来源于stack exchange,提问作者chav1s
相关产品推荐
相关产品推荐

