3

ここで私の最初の質問です:)

私は現在、キャラクター デバイスを提供し、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 に対して機能するかどうかはわかりません。)

私が間違っていることは何か分かりますか?

ありがとうございました。

4

1 に答える 1