Usb kext在10.7下隐藏卸载失败,但10.6工作正常

Usb kext在10.7下隐藏卸载失败,但10.6工作正常,usb,hid,iokit,kernel-extension,Usb,Hid,Iokit,Kernel Extension,我正在为MacOSX(Windows已经在运行)开发一个虚拟USB总线驱动程序,该驱动程序通过网络与linux设备相连。在10.6和10.7下,它可以使用大容量存储设备和隐藏设备(如鼠标或键盘)正常工作 但对于HID设备,移除设备(拔出)或更简单的卸载kext失败 在10.7(.5)下,因为还有一个实例(分离后,保留计数不会降为零)。 我的10.6和10.7测试环境与MacBooksPro 8.2 i7相同 有时在一段时间后(5-50分钟),kext在我这边没有动作的情况下变得自由。 它似乎不依

我正在为MacOSX(Windows已经在运行)开发一个虚拟USB总线驱动程序,该驱动程序通过网络与linux设备相连。在10.6和10.7下,它可以使用大容量存储设备和隐藏设备(如鼠标或键盘)正常工作

但对于HID设备,移除设备(拔出)或更简单的卸载kext失败 在10.7(.5)下,因为还有一个实例(分离后,保留计数不会降为零)。 我的10.6和10.7测试环境与MacBooksPro 8.2 i7相同

有时在一段时间后(5-50分钟),kext在我这边没有动作的情况下变得自由。 它似乎不依赖于不断变化的电源模式

是的,我有USBFamily日志库和很多输出,但是在工作(kextunload ok)和不工作运行之间,我发现日志没有什么不同,即使日志级别为7

因为大容量存储设备似乎工作得很好,我想问题出在die HID驱动程序堆栈内部,尤其是在10.7下

在10.6和10.7之间删除USB HID设备驱动程序堆栈是否存在已知差异

My kext是一个(虚拟)ControllerV3派生类,为任何真正的插入式(在远程linux机箱上)USB设备建立/创建USB设备。使用XCode 4.4.1

提前感谢您的任何想法或提示, 当做 马库斯

PS:在我看来有点奇怪,在10.7以下,那么多隐藏对象都在驱动程序堆栈的顶部。在kextunload(失败“.VirDevice有1个实例”)之后,它们似乎还活着。但这与本地插拔的Logitech鼠标完全相同

从我这里,只有最低的两个对象MsVirBus(虚拟USB总线,源自IOUSBControllerV3)和Mouse@xaffe003fwith是一个派生对象


我对HID堆栈没有深入的经验,但我可以为您提供一些关于如何追踪此类问题根源的通用IOKit/kext建议

kextunload
对I/O注册表中的所有对象调用
terminate()
。这意味着有两种情况会导致您最终无法卸载kext:

  • terminate()
    删除所有子对象失败或失败

  • 其余的活动对象都不在I/O注册表中

  • 使用
    ioreg
    命令检查是否有任何对象保留在I/O注册表中。还要检查他们有哪些客户端,因为这些客户端通常会阻止删除

    如果注册表中没有对象,则很可能是保留/释放不匹配。我给出了一些关于追踪这些信息的建议,所以在此不再重复。这似乎也不太可能,因为您的kext最终会卸载并在10.6上运行

    如果I/O注册表中还有对象,则需要跟踪这些对象仍然存在的原因。如果您尚未在类中重写
    terminate()
    ,请添加虚拟重写,该重写只将调用转发给基类实现。但是用日志输出包装转发呼叫,并输出呼叫是否成功。如果您已经覆盖了
    终止
    ,请添加类似的日志记录。您可能还希望为
    didtimiter()
    添加类似的日志记录,因为终止可以是异步的


    拔下USB设备时,应将设备树下的
    terminate()
    传递给客户端。我会检查EHCI控制器代码的等效部分,看看是否需要任何特殊参数等。

    非常感谢您的建设性建议!注册表似乎已清理完毕。在驱动程序堆栈的顶部仍然有很多有趣的HID对象,但这看起来与本地的插拔鼠标相同(我使用的是光纤连接的Logitech鼠标,简单的标准)。我不知道如何在这里添加图片,也许在kextunload之后查看堆栈会很有意思。要覆盖taggedRetain/Release方法是个好主意,我将在周一尝试并尽快添加e反馈。另一件奇怪的事情是,在卸载错误“…有1个实例”后,我可以再次加载kext,并且它运行良好。第二次卸载后,即时计数“1”出现了相同的错误。您好,在我在这里调用帮助之前,我已经在日志中添加了一些getRetainCount()信息,但是您建议的重载方法要聪明得多。到目前为止,回溯不起作用,系统挂起繁忙的鼠标指针(旋转彩色球),但由于我使用USBLogger,我想OSDebug还有一些事情要做。计数器的结果与预期一样:对于10.6,下降到0;对于10.7,下降到1。USBDevice::成功匹配并建立驱动程序堆栈后启动…….我看到了很多重载的标记函数,但除此之外什么都没有,所以我仍然不知道谁对我的虚拟USBDevice不走运,谁没有减少计数器。接下来,我必须尝试运行回溯,以获得更多信息,了解哪里出了问题。谢谢你。