DriverKit 系统扩展能否在启动时匹配热插拔设备?

Can a DriverKit System Extension match a hot pluggable device at boot time?

我有一个 DriverKit 扩展,可以很好地匹配 USB 音频设备,但如果我在重启期间让设备保持插入状态,AppleUSBAudio 内核扩展会匹配它。

拔下并重新插入加载我的 dext。

这是意料之中的事吗?所有的系统扩展都有这个缺点吗?我该如何补救?

在 macOS 11 上,如果 Apple 的 kexts 之一与您的设备相匹配,并且他们的驱动程序位于“boot”或“sys”集合中(请参阅 man kmutil),这通常是这样,那么他们的驱动程序将赢得与您的匹配,即使您的探测分数更高。

在 macOS 10.15 上,这应该取决于他们的 kext 是否在预链接的 kernel/kext 缓存中。第三方 kexts 也可以包含在这里,所以它至少更民主一点。但是,Dexts 不能在 kextcache 中。

我已就此问题提交了 Apple DTS TSI,他们已将其确认为错误。我强烈建议您也将其作为错误提交,以增加修复它的机会。

如果您的驱动程序没有设法获取它,您应该能够通过 explicitly force resetting the device 来自用户 space 守护程序以相当丑陋的方式解决它。这将导致它被 USB 子系统重新枚举,并且 I/O 重复套件匹配,此时您的 dext 希望能够获胜!