【发布时间】:2018-01-03 10:28:37
【问题描述】:
我有 IOKit 基本驱动程序,它是非硬件触发的,源自 IOResources。它还使用IOServiceOpen 向用户空间客户端类提供,但我认为这与我的问题无关......主驱动程序具有派生驱动程序 Info.plist 文件中提到的 IOKit 依赖性:
<key>OSBundleLibraries</key>
<dict>
...
..
.
<key>com.derived.driver</key>
<string>1.0.0</string>
</dict>
另一个驱动程序(由com.derived.driver标识)作为通用内核扩展实现并存储在/Library/Extensions中。
当我加载基本驱动程序时,派生的驱动程序会自动加载。由于派生驱动驻留在/Library/Extensions 中,因此也可以在kextcache 触发派生驱动之前加载。
但是,当我将派生驱动程序从通用格式转换为 IOKit 格式时,它停止工作,因此现在两个驱动程序 IOProviderClass 都是 IOResources。
似乎派生驱动程序只是拒绝启动它是基于 IOService 的类,在输出日志中没有任何错误迹象(我使用调试器并看到它实际上达到 IOService::probeCandidates 但不是 IOService::startCandidate。因为内核经过优化编译,我无法确定确切的流程)。
当我查看kextstat 当前加载的驱动程序时,似乎两个驱动程序都已加载,但根据ioreg,只有基本驱动程序具有活动实例(我期望两个驱动程序将共享同一个提供程序,即IO 资源)。
此外,过了一会儿,似乎高级驱动程序简单地从加载的 kexts 中删除(可能是由于空闲)..
我的设计是否合法,或者我是否还必须将基本驱动程序中的 IOProviderClass 字段从 IOResources 更改为派生驱动程序基于 IOService 的类。
<key>IOKitPersonalities</key>
<dict>
<key>myDriver</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.base.driver</string>
<key>IOClass</key>
<string>com_base_driver</string>
<key>IOProviderClass</key>
<string>com_derived_driver</string>
编辑: 我确实做到了,并且成功了(所有实例都已根据 ioreg 进行了初始化)。
+-o com_derived_driver <class com_derived_driver, id 0x10000091f, registered, matched, active, busy 0 (804415 ms), retain 6>
+-o com_base_driver <class com_base_mng, id 0x100000920, registered, matched, active, busy 0 (0 ms), retain 9>
但老实说,我不知道为什么,任何解释将不胜感激。
谢谢!
【问题讨论】:
标签: c++ macos iokit kernel-extension xnu