即使在卸载安装它的驱动程序后,协议是不是继续在内存中并可供其他驱动程序使用?

Posted

技术标签:

【中文标题】即使在卸载安装它的驱动程序后,协议是不是继续在内存中并可供其他驱动程序使用?【英文标题】:Does a protocol continue to be in memory and usable by other drivers even after the driver that installed it is unloaded?即使在卸载安装它的驱动程序后,协议是否继续在内存中并可供其他驱动程序使用? 【发布时间】:2022-01-10 01:54:15 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

驱动程序或应用程序需要在退出前卸载其协议并释放相关内存。它不是由 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:

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

【讨论】:

以上是关于即使在卸载安装它的驱动程序后,协议是不是继续在内存中并可供其他驱动程序使用?的主要内容,如果未能解决你的问题,请参考以下文章

百度云安装在D盘后,无法打开。卸载后继续安装,提示已有百度云是不是覆盖,安装的时候提示报错。WIN10系统

UILocalNotifications 在卸载/更新后是不是仍然存在?

iOS 钥匙串中的项目能否在应用程序卸载和重新安装后继续存在?

即使在应用程序卸载后,Cordova LocalStorage 也会保留数据

即使在卸载后仍保持贝宝应用内购买

安装了office后怎么安装visio