1

如果我们有一个在 EDK2/UEFI 中安装协议的驱动程序,然后卸载该驱动程序,该协议是否继续存在并可供其他驱动程序和服务使用?UEFI 应用程序的相同问题。我主要想知道 UEFI 框架是否以某种方式将协议与安装它们的驱动程序联系起来,如果驱动程序被卸载,协议是否在卸载图像后仍可供其他驱动程序使用,或者协议是否在驱动程序被卸载时也退出内存。

我认为当然可以编写代码来使这种情况成为当驱动程序退出时它会卸载它所创建的协议,但是这是否会在 UEFI/EDK2 中默认发生?或者只有当驱动程序明确声明在卸载协议时卸载协议时才会发生这种情况?

此外,这里的行业最佳实践是什么?协议通常应该继续存在于安装它们的驱动程序之后,还是应该将两者联系起来?

对不起,如果这个问题是高水平的。我正在尝试对这个主题获得一些高级别的直觉。

4

1 回答 1

2

驱动程序或应用程序需要在退出前卸载其协议并释放相关内存。它不是由 UEFI 核心自动完成的。

由于协议通常包含指向驱动程序中函数的指针,因此在协议仍然存在时,驱动程序不可能被卸载。(但是,有可能孤立一个不包含任何函数指针的协议。)

(引文来自 UEFI 规范版本 2.8。)

7.4、EFI_IMAGE_ENTRY_POINT:

如果图像支持动态卸载,则它必须在 EFI_LOADED_IMAGE_PROTOCOL 结构中提供一个卸载函数,然后才能从其入口点返回控制权。

7.4 退出:

当 EFI 引导服务驱动程序或运行时服务驱动程序退出时,固件仅在 ExitStatus 是错误代码时才释放映像;否则图像将驻留在内存中。如果驱动程序在系统中安装了任何尚未(或无法)清理的协议处理程序或其他活动回调,则它不得返回错误代码。如果驱动程序以错误代码退出,它负责在退出之前释放所有资源。

7.4、卸载图像:

如果图像已启动并且有一个 Unload() 入口点,则控制权将传递给该入口点。如果图像的卸载函数返回 EFI_SUCCESS,则图像被卸载;否则,图像的卸载函数返回的错误将返回给调用者。图像卸载函数负责释放所有分配的内存,并确保在返回 EFI_SUCCESS 之前没有对任何已释放内存或图像本身的引用。
如果映像已启动并且没有 Unload() 入口点,则该函数返回 EFI_UNSUPPORTED。

4.7.3:

任何已安装的协议或分配的内存……都必须卸载或释放 [在驱动程序的卸载功能中]。

于 2021-12-05T20:39:20.827 回答