我正在研究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派生对象 .
1 回答
我没有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控制器代码的等效部分,以查看是否需要任何特殊参数等 .