gpt4 book ai didi

macos - OSX Kext 没有被正确释放

转载 作者:行者123 更新时间:2023-12-05 01:17:15 26 4
gpt4 key购买 nike

我为热插拔 SCSI 设备编写了一个设备驱动程序 kext,有点基于 Wagerlabs code (使用驱动程序-用户客户端-应用程序模型)并且一切正常。唯一剩下的问题是驱动程序似乎没有一直被释放,尤其是在应用程序崩溃的情况下。例如,当我尝试卸载 kext 时,即使设备断开连接并关闭应用程序,仍然存在驱动程序和用户客户端的未完成实例(驱动程序通常超过用户客户端)。

我已经登录驱动程序功能,如 free() ,当我关闭计算机时,我可以看到这些正在执行,因此显然仍然可以终止实例。确保驱动程序实例终止和释放的“正确”方法是什么,即使主机应用程序崩溃、不正确终止或事情通常不会按计划进行?

最佳答案

如果您在没有用户客户端应用程序运行时获得了用户客户端类实例,那么您保留用户客户端实例的频率肯定比释放它们的频率更高。例如,您可能会在主驱动程序类中保留对客户端实例的引用。在您的用户客户端类的 stop() 中方法,请确保从驱动程序中删除该客户端实例。

另一件需要注意的事情:确保从内置 IOService 方法的重写版本中调用父类(super class)实现,例如 stop() , free()等等。不这样做通常会使 IO Kit 进入不一致的状态。

最后,用于调试 I/O Kit 驱动程序中的保留泄漏的一种有用技术是通过使用日志版本覆盖方法来实际记录保留和发布:

void MyClass::taggedRetain(const void* tag) const
{
OSReportWithBacktrace(
"MyClass" CLASS_OBJECT_FORMAT_STRING "::taggedRetain(tag=%p)\n", CLASS_OBJECT_FORMAT(this), tag);
IOService::taggedRetain(tag);
}
void MyClass::taggedRelease(const void * tag) const
{
OSReportWithBacktrace(
"MyClass" CLASS_OBJECT_FORMAT_STRING "::taggedRelease(tag=%p)\n", CLASS_OBJECT_FORMAT(this), tag);
int count = getRetainCount();
IOService::taggedRelease(tag);
if (count == 1)
printf(
"MyClass::taggedRelease(tag=%p) final done\n", tag);
else
printf(
"MyClass" CLASS_OBJECT_FORMAT_STRING "::taggedRelease(tag=%p) done\n", CLASS_OBJECT_FORMAT(this), tag);
}

此代码中的宏在标题中定义如下:
#define CLASS_OBJECT_FORMAT_STRING "[%s@%p:%dx]"
#define CLASS_OBJECT_FORMAT(obj) myClassName(obj), obj, myRefCount(obj)

inline int myRefCount(const OSObject* obj)
{
return obj ? obj->getRetainCount() : 0;
}

inline const char* myClassName(const OSObject* obj)
{
if (!obj) return "(null)";
return obj->getMetaClass()->getClassName();
}
#endif

我应该解释一下 taggedRetain()taggedRelease()retain() 的实际底层实现和 release() - 如果您覆盖后者,您将看不到来自 OSCollections 的任何保留和发布,因为它们使用标记版本(带有非空标记)。
OSReportWithBacktrace() 生成的回溯不幸的是,它只是一堆十六进制指针,但您可以使用 gdb 查找它们。

在任何情况下,通过记录对象的保留和发布,您可以检查所有保留并确保它们与正确位置的发布匹配。注意周期!

关于macos - OSX Kext 没有被正确释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13451563/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com