ハードウェア以外でトリガーされ、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 形式に変換すると動作が停止し、両方のドライバーIOProviderClass
がIOResources
.
派生ドライバーは、出力ログにエラーの兆候がなく、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>
しかし、正直なところ、理由はわかりません。説明をいただければ幸いです。
ありがとう !