首页 文章

kext隐藏在10.7卸载失败但10.6工作完美无缺

提问于
浏览
3

我正在研究MacOSX的虚拟USB总线驱动程序(Windows已经运行)通过网络连接到Linux机箱 . 它可以在10.6和10.7下使用大容量存储设备和鼠标或键盘等HID设备正常工作 .

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

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

是的,我有USB家庭日志库和大量输出,但在工作(kextunload ok)和不工作运行之间我发现记录没有区别,即使是日志记录级别7 .

由于大容量存储设备似乎运行良好,我猜问题是在HID驱动程序堆栈内特别是在10.7以下?

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

我的kext是(虚拟)ControllerV3派生类,为任何真正插入的(在远程linux盒子)USB设备上 Build /创建USBDevice . 使用XCode 4.4.1 .

提前感谢任何想法或提示,请问马库斯

PS:对我来说看起来有点奇怪,10.7以下这么多HID对象都在驱动程序堆栈之上 . 在kextunload(失败“.VirDevice有1个实例”)之后,它们似乎还活着 . 但这与100%相同的本地插入和拔出的罗技鼠标相同 .

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

Driver Stack after kextunload

1 回答

  • 2

    我没有HID堆栈的丰富经验,但我可以给你一些关于如何追踪这类问题的来源的一般IOKit / kext建议 .

    kextunload 在I / O注册表中的所有对象上调用 terminate() . 这意味着有两种情况可能导致您无法卸载kext:

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

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

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

    如果注册表中没有您的对象,则很可能会出现保留/释放不匹配的情况 . 我提供了一些关于跟踪这些内容的建议in this answer所以我很可能因为你的kext最终卸载并且在10.6上工作 .

    如果I / O注册表中有对象,则'll need to track down why those are still there. If you aren'已经覆盖了类中的 terminate() ,添加虚拟覆盖,只是将调用转发给基类实现 . 但是使用日志输出包装该转发调用,并输出调用是否成功 . 如果您已经覆盖 terminate ,请添加类似的日志记录 . 您可能还想为 didTerminate() 添加类似的日志记录,因为终止可以是异步的 .

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

相关问题