我正在将无代码的KEXT迁移到DriverKit。用于为在固件升级模式下显示为符合HID的USB设备禁用IOKit HID驱动程序。
到目前为止,我已经设法将IOService
的空子类与相关设备进行匹配。这是我正在使用的IOKitPersonalities
条目的示例:
<dict>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleIdentifierKernel</key>
<string>com.apple.kpi.iokit</string>
<key>IOClass</key>
<string>IOUserService</string>
<key>IOProviderClass</key>
<string>IOUSBHostInterface</string>
<key>IOResourceMatch</key>
<string>IOKit</string>
<key>IOUserClass</key>
<string>DriverKitTestExtension</string>
<key>IOUserServerName</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>bConfigurationValue</key>
<integer>1</integer>
<key>bInterfaceNumber</key>
<integer>0</integer>
<key>idVendor</key>
<integer><!-- USB Vendor ID --></integer>
<key>idProduct</key>
<integer><!-- USB Product ID --></integer>
</dict>
使用IOUSBHostInterface
作为此用例的提供程序类是否正确?我也尝试使用旧的IOUSBInterface
(不推荐使用),但它与IOUSBHostInterface
的问题相同。
新的DEXT正在运行,但是我在固件更新代码中看到一些不良的性能下降。调用libusb花费数十秒钟。如果我使用旧的KEXT,它们会立即返回。
以下是该问题的一些示例痕迹:
5 redacted 3168.0 libusb_claim_interface ..../libusb/Sources/libusb/core.c:1310
4 redacted 3168.0 darwin_claim_interface ..../libusb/Sources/libusb/darwin_usb.c:1089
3 IOUSBLib 1668.0 IOUSBInterfaceClass::USBInterfaceOpen(bool)
2 IOKit 1668.0 io_service_wait_quiet
1 libsystem_kernel.dylib 1668.0 mach_msg
0 libsystem_kernel.dylib 1668.0 mach_msg_trap
和:
7 redacted 1859.0 libusb_get_device_list ..../libusb/Sources/libusb/core.c:632
6 redacted 1859.0 darwin_get_device_list ..../libusb/Sources/libusb/darwin_usb.c:780
5 redacted 1859.0 process_new_device ..../libusb/Sources/libusb/darwin_usb.c:726
4 redacted 1766.0 darwin_check_configuration ..../libusb/Sources/libusb/darwin_usb.c:540
3 IOKit 1766.0 IOIteratorNext
2 IOKit 1766.0 io_iterator_next
1 libsystem_kernel.dylib 1766.0 mach_msg
0 libsystem_kernel.dylib 1766.0 mach_msg_trap
0 libsystem_kernel.dylib 1766.0 mach_msg_trap
这些已在启用了“记录等待线程”的情况下记录在“ Time Profiler”工具中。
我可以在DEXT中做任何事情来解决此问题吗?我尝试了继承IOUSBHostInterface
而不是IOService
的子类,但这没什么区别。
以下是运行“ ioreg -lirc IOUSBHostInterface”的相关输出:
+-o IOUSBHostInterface@0
| {
| "USBSpeed" = 1
| "iInterface" = 0
| "IOServiceLegacyMatchingRegistryID" = 4294971983
| "bInterfaceProtocol" = 0
| "bAlternateSetting" = 0
| "idProduct" =
| "bcdDevice" = 292
| "USB Product Name" =
| "locationID" = 338690048
| "bInterfaceClass" = 3
| "bInterfaceSubClass" = 0
| "IOCFPlugInTypes" = {"2d9786c6-9ef3-11d4-ad51-000a27052861"="IOUSBHostFamily.kext/Contents/PlugIns/IOUSBLib.bundle"}
| "USBPortType" = 0
| "bConfigurationValue" = 1
| "bInterfaceNumber" = 0
| "USB Vendor Name" =
| "IOServiceDEXTEntitlements" = (("com.apple.developer.driverkit.transport.usb"))
| "idVendor" =
| "bNumEndpoints" = 2
| "IOGeneralInterest" = "IOCommand is not serializable"
| "IOClassNameOverride" = "IOUSBInterface"
| }
|
+-o DriverKitTestExtension
{
"IOClass" = "IOUserService"
"CFBundleIdentifier" =
"IOProviderClass" = "IOUSBHostInterface"
"IOUserServerCDHash" = "faa70138281d36b53946591685ccdceba4a5d638"
"idProduct" =
"IOResourceMatch" = "IOKit"
"bConfigurationValue" = 1
"IOProbeScore" = 90000
"IOMatchCategory" = "com.apple.null.driver"
"IOUserServerName" =
"IOMatchedPersonality" = {"IOClass"="IOUserService","CFBundleIdentifier"=" ","IOProviderClass"="IOUSBHostInterface","IOUserServerCDHash"="faa70138281d36b53946591685ccdceba4a5d638","idProduct"=,"IOResourceMatch"="IOKit","bConfigurationValue"=1,"IOMatchCategory"="com.apple.null.driver","IOUserServerName"=,"idVendor"=,"CFBundleIdentifierKernel"="com.apple.kpi.iokit","bInterfaceNumber"=0,"IOUserClass"="DriverKitTestExtension"}
"idVendor" =
"CFBundleIdentifierKernel" = "com.apple.kpi.iokit"
"bInterfaceNumber" = 0
"IOUserClass" = "DriverKitTestExtension"
}
欢迎任何输入!
我终于找到了问题!阅读How to set `com.apple.developer.driverkit.transport.usb` entitlement?之后,我决定尝试使用DEXT的权利。这使我意识到根本没有加载DEXT。
我从以下位置更改了DEXT权利:
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.driverkit</key>
<true/>
<key>com.apple.developer.driverkit.transport.usb</key>
<true/>
</dict>
</plist>
收件人:
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.driverkit</key>
<true/>
<key>com.apple.developer.driverkit.transport.usb</key>
<array>
<dict>
<key>idVendor</key>
<integer><!-- USB Vendor ID --></integer>
</dict>
</array>
</dict>
</plist>
[此后,现在显示我的IOService
子类的日志消息(将log stream
与grep
结合使用)。固件升级期间性能恢复正常。