【问题标题】:Performance issue after migrating from codeless KEXT to DEXT从无代码 KEXT 迁移到 DEXT 后的性能问题
【发布时间】:2020-08-21 04:58:40
【问题描述】:

我正在将无代码 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

这些记录在启用“记录等待线程”的“时间分析器”工具中。

我可以在 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"
      }

欢迎任何意见!

【问题讨论】:

  • 出于好奇,我尝试将旧的无代码 KEXT 更改为使用 IOUSBHostInterface(如 DEXT)而不是 IOUSBInterface 代替 IOProviderClass。性能还是不错的。

标签: macos libusb iokit kernel-extension driverkit


【解决方案1】:

我终于找到问题了!在阅读了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 streamgrep)。固件升级期间的性能恢复正常。

【讨论】:

  • 我正在考虑编写一个无代码 dext 以防止使用 IOUSBMassStorageDriver 安装特定设备,这样我就可以通过 WebUSB 访问它。你最后成功了吗?你知道是否可以独立于应用程序安装无代码 dext 吗?关于从哪里开始的任何指示?
  • @Gerrit 是的,我能够阻止标准 IOKit HID 驱动程序匹配特定的 USB 供应商 ID/产品 ID。我认为您应该发布一个新的 SO 问题,而不是在 cmets 中讨论。如果你从这里链接到你的问题,我会看看我是否可以回答。
  • 附带说明,我对 WebUSB 了解不多,但如果允许您从浏览器访问大容量存储,我会感到惊讶。这个问题可能是相关的:stackoverflow.com/questions/49162692/…
  • 谢谢,这给了我希望! :) 我想阻止 IOKit MassStorage 驱动程序匹配特定的 USB 供应商 ID 和产品 ID,在这种情况下,我应该能够从 WebUSB 访问它。在获得 DriverKit 权利之前,我使用 github.com/stuartlynne/USBApp-updated 作为开始。如果我遇到任何具体问题,我一定会发布一个新问题。
  • 我打算发布一个新的 SO 问题,但似乎已经存在几个问题:-stackoverflow.com/questions/63212902/… -stackoverflow.com/questions/62442970/… 也可以回答我的问题。
猜你喜欢
  • 2020-11-22
  • 2020-10-08
  • 2021-09-15
  • 1970-01-01
  • 2020-09-26
  • 2020-09-22
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
相关资源
最近更新 更多