c – IOKit驱动程序已加载但未启动

c – IOKit驱动程序已加载但未启动,第1张

概述我有非硬件触发的IOKit基本驱动程序,并且源自IOResources.它还使用 IOServiceOpen提供给用户空间客户端类,但我认为它与我的问题无关……主驱动程序具有IOKit依赖性,如派生驱动程序Info.plist文件中所述: <key>OSBundleLibraries</key><dict> ... .. . <key>com.derived.dr 我有非硬件触发的IOKit基本驱动程序,并且源自IOResources.它还使用 IOServiceOpen提供给用户空间客户端类,但我认为它与我的问题无关……主驱动程序具有IOKit依赖性,如派生驱动程序Info.pList文件中所述:

<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,只有基本驱动程序具有活动实例(我原以为两个驱动程序将共享同一个提供程序,即IOResources).

而且,过了一段时间,似乎更高的驱动程序简单地从加载的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,busy 0 (0 ms),retain 9>

但我老实说不知道为什么,任何解释都会受到高度赞赏.

谢谢 !

解决方法 我只能猜测,因为您还没有提供完整的信息 – 特别是,您没有提供两个驱动程序的完整IOKit个性词典.

请注意,通常,只有一个服务会成功匹配IOService成为其客户端.如果您希望多个不同类型的客户端匹配,则需要通过个性词典中的IOMatchcategory键定义不同的匹配类别.许多司机需要专门匹配IOResources,所以the rule for that case is to use the bundle identifier as match category.我怀疑这是你一直缺少的?

最后,关于使用默认发行版内核遇到问题的附注:内核调试工具包(KDK)提供了备用开发和调试内核,这些内核使用远不那么激进的优化设置进行编译.您可能会发现它们很有用 – 请查看KDK的自述文件,了解有关如何启用它们的详细信息.

总结

以上是内存溢出为你收集整理的c – IOKit驱动程序已加载但未启动全部内容,希望文章能够帮你解决c – IOKit驱动程序已加载但未启动所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1229035.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存