ここで私の最初の質問です:)
私は現在、キャラクター デバイスを提供し、OSX 10.7+ をターゲットとする一般的な kext を作成しています。これは純粋な C であり、IOKit/C++ はゼロです。(これが問題になる場合は、10.11 でドライバーをテストしています。)
キャラクターデバイスを参照するすべてのファイル記述子が閉じられたら、ドライバーをアンロードしたいのですが、うまくいかないようです。
AppleのドキュメントによるとOSKextRetainKextWithLoadTag
:
autounload が有効な場合、kext の最後の参照がドロップされた直後に、kext への未解決の参照がなく、その Libkern C++ サブクラスのインスタンス (存在する場合) がない場合、kext はアンロードされます。
...
IOService のサブクラスを定義する Kext では、autounload が自動的に有効になります。他の kext は、参照カウントを使用して自動アンロードを管理でき、Libkern C++ オブジェクトを定義および作成する必要はありません。
前述のように、私の kext にはIOService
サブクラス (さらに言えばクラス) がないため、OSKextRetainKextWithLoadTag
.
ただし、すべてのファイル記述子が閉じられた後、kext は永久にロードされたままになります。
static int cdev_open(dev_t dev, int flags, int devtype, struct proc *p)
{
/* ... */
return OSKextRetainKextWithLoadTag(OSKextGetCurrentLoadTag()) == kOSReturnSuccess) ? 0 : kOSReturnError
}
static int cdev_close(dev_t dev, int flags, int devtype, struct proc *p)
{
/* ... */
OSKextReleaseKextWithLoadTag(OSKextGetCurrentLoadTag());
return 0;
}
さらに、一般的な kext でアンロードがサポートされなくなった場合にIOService
備えて、(プロバイダーとして) サブクラスを提供するシン C++ ラッパーで開始ルーチンと停止ルーチンをラップした kext の「ハイブリッド」バージョンを作成しました。同じ結果です。IOResources
OSKextRetainKextWithLoadTag
( andを使用する一般的な kext の例をいくつか見つけましOSKextReleaseKextWithLoadTag
たが、それらは非常に古く、最近のバージョンの OS X に対して機能するかどうかはわかりません。)
私が間違っていることは何か分かりますか?
ありがとうございました。