即使在卸载了安装协议的驱动程序之后,协议是否仍在内存中并可供其他驱动程序使用



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

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

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

很抱歉,如果这个问题是高级别的。我正试图为这个话题获得一些高层次的直觉。

需要一个驱动程序或应用程序在退出之前卸载其协议并释放相关内存。UEFI核心不会自动执行此操作。

由于协议通常包含指向驱动程序中函数的指针,因此在协议仍然存在的情况下,不可能卸载驱动程序。(然而,可以孤立一个不包含任何函数指针的协议。(

(引用来自UEFI规范2.8版。(

7.4,EFI_IMAGE_ENTRY_POINT:

如果映像支持动态卸载,则在从其入口点返回控制之前,它必须在EFI_LOADED_image_PROTOCOL结构中提供卸载函数。

7.4退出:

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

7.4,卸载图像:

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

4.7.3:

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

相关内容

  • 没有找到相关文章

最新更新