- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力将无代码 KEXT 迁移到 DriverKit。它用于禁用 USB 设备的 IOKit HID 驱动程序,这些设备在固件升级模式下显示为符合 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"
}
欢迎任何意见!
最佳答案
终于找到问题了!看完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>
在此之后,来 self 的 IOService
子类的日志消息现在显示出来(使用 log stream
和 grep
)。固件升级期间性能恢复正常。
关于macos - 从无代码 KEXT 迁移到 DEXT 后的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61631669/
我正在构建内核扩展并为其创建一个 .kext 目录。从另一个库 API,我正在使用 KextManager APIs将这个 kext 加载到内核中。 一切看起来都很好,这是我加载 kext 的代码片段
在某些用户定义的事件期间,如何在 CPU、内存或线程使用方面衡量 OS X 中 kext 的性能影响?任何可以从用户空间使用的特定方法工具?或任何可以考虑的方法/方法? 最佳答案 您基本上有两个选择:
大多数防病毒软件如何在文件受感染时阻止文件系统 io?我想所有的魔力都在于一些自定义的 kext 来做到这一点。有人能给我指出一些与此相关的主题吗?一些工作示例也很棒。我读过有关 kext 开发的苹果
我有一个需要 kext 的 Mac OS X 应用程序(也是我构建的)。我想将kext“捆绑”到应用程序中,这样当用户运行应用程序时,kext就会自动加载(当然,可能会提示输入管理员密码)。是否可能,
我尝试在运行 11.4 Beta (20F5046g) Big Sur 的 M1 机器上加载 kext 模块,并在加载 kext 模块时遇到一些关于绑定(bind)的错误消息。 访问从 Apple k
我为热插拔 SCSI 设备编写了一个设备驱动程序 kext,有点基于 Wagerlabs code (使用驱动程序-用户客户端-应用程序模型)并且一切正常。唯一剩下的问题是驱动程序似乎没有一直被释放,
在 KEXT 中,我需要做一些处理,在那里我会得到一个 proc_t 或只是一个 pid。 如果我走 pid 路线,我会做各种各样的 sysctl() 。 不幸的是,我也做不到。 proc_t 是未定
我正在开发 Kext,它应该可以访问 struct proc->p_pid field 。问题是该结构仅在 XNU 源中定义,所以我面临 incomplete definition of type '
回到 IOKit 的工作(El Capitan 带来的 USB 变化似乎相当彻底),我发现调试 kext panic 日志是后端的一个痛苦。 在我开发和测试时,是否可以将符号保留在内核扩展中,以便它们
我正在构建一个 kext,以在 OS X 上提供额外的安全层(围绕 KAtuh 构建)。我在用户空间中使用一个客户端,通过套接字连接到 kext(按照 Apple 的建议),并基本上控制 kext。由
回到 IOKit 的工作(El Capitan 带来的 USB 变化似乎相当彻底),我发现调试 kext panic 日志是后端的一个痛苦。 在我开发和测试时,是否可以将符号保留在内核扩展中,以便它们
在 KEXT 中,我正在通过 vnode 或文件范围监听器监听文件关闭。对于某些(很少)文件,我需要将文件路径发送到我的系统守护进程,该守护进程会进行一些处理(这必须在守护进程中发生)并将结果返回到
在一个项目中,我最近尝试在 osx 10.9.5 上通过 libusb 访问 USB 存储设备。但显然一些默认驱动程序声称该设备,我无法访问它。当我尝试通过 libusb 访问它时,它返回我有“权限不
只是想知道是否有可能在 kext 中为给定的 proc_t 获取任务。我试过 task_for_pid() ,但由于某种我不记得的原因没有用。我尝试了 sys/proc.h 中的 proc_task(
我有两个 kext,kextA 和 kextB。在 kextA 中,我试图动态转换(使用 OSDynamicCast)一个指向 kextB 中的类的指针。 $ sudo kextutil -n -t
我最近在为 osx 10.9 编写内核模块,发现我编译的最终二进制文件中的每个符号都未被 nm 工具定义。 如何通过在build设置中指定标志来完成?我的意思是,当您构建用户模式应用程序时,如果它有未
我需要覆盖一个由kext定义的方法来做我自己的处理并返回我自己的值,所以每当kext调用这个方法时,它就会被路由到我的。所以我想做的是在我自己的内核扩展中定义这个方法,然后加载它。 问题是我不知道如何
我们有一个音频内核扩展,它安装在/Library/Extensions 中。 根据苹果新指南(WWDC 视频 707),我们应该对安装/Library/Extensions 的 kext 进行编码。
我有一个有效的 OSX 内核扩展,我希望在启动时尽早自动加载它。 kext 正在使用 KAUTH用于监视特定路径上的访问,因此在我看来,不会有任何东西会要求将其加载到内核中。在这种情况下,将其复制到
在之前安装了我的产品的机器上,由于 kext 签名拒绝,第二次安装失败。 我在某些地方看到过同样的错误,例如这里:https://support.eset.com/kb6570 ,然而,即使在恢复模式
我是一名优秀的程序员,十分优秀!