3

ハードウェア以外でトリガーされ、IOResources から派生する IOKit ベース ドライバーがあります。また、ユーザー空間のクライアントクラスにも提供しますIOServiceOpenが、私の問題には関係ないと思います...派生ドライバーInfo.plistファイルに記載されているように、メインドライバーにはIOKit依存関係があります:

<key>OSBundleLibraries</key>
<dict>
    ...
    ..
    .
    <key>com.derived.driver</key>
    <string>1.0.0</string>
</dict> 

もう 1 つのドライバー ( で識別com.derived.driver) は、一般的なカーネル拡張機能として実装され、 に格納され/Library/Extensionsます。

ベースドライバーをロードすると、派生が自動的にロードされます。派生ドライバーが存在するため、/Library/Extensionsによって派生ドライバーをトリガーする前にロードすることもできますkextcache

ただし、派生ドライバーを汎用から IOKit 形式に変換すると動作が停止し、両方のドライバーIOProviderClassIOResources.

派生ドライバーは、出力ログにエラーの兆候がなく、IOService ベースのクラスの開始を単に拒否しているようです (デバッガーを使用して、実際には到達IOService::probeCandidatesしないことを確認しましIOService::startCandidateた。カーネルは最適化でコンパイルされたため、できませんでした正確な流れについては私の指を入れてください)。

現在ロードされkextstatているドライバーを見ると、両方のドライバーがロードされているように見えますioregが、ベースドライバーだけがアクティブなインスタンスを持っているようです (両方のドライバーが同じプロバイダーである IOResources を共有すると予想していました)。

さらに、しばらくすると、ロードされたkextから上位​​のドライバーが簡単に削除されたようです(おそらくアイドル状態のため)..

私の設計は合法に見えますか、それとも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>

しかし、正直なところ、理由はわかりません。説明をいただければ幸いです。

ありがとう !

4

1 に答える 1