オーディオデバイスドライバー用のOSXカーネル拡張機能を作成しています(これはソフトウェアですが、ハードウェアデバイスをエミュレートします)。
開発中は、既存の古いバージョンを完全にアンインストールしてから、新しいバージョンを最初からビルドしてインストールすると便利です。ただし、これはシステムを再起動しないと不可能な場合があります。
プログラム自体が実行されておらず、ソースファイルがディレクトリから削除されています/System/Library/Extensions/
。
しかしkextstat
、単一のインスタンスを明らかにします:
$ kextstat | grep 'com.foo.driver.bar'
219 0 0xfff123 0x5000 0x5000 com.foo.driver.bar (0.0.1) <102 5 4 3>
(...意味:)
Index Refs Address Size Wired Name (Version) <Linked Against>
したがって、私のドライバーインスタンスには0の参照がありますがkextunload
、既存のインスタンスに不平を言って失敗することがあります。
$ sudo kextunload -b com.foo.driver.bar
(kernel) Can't unload kext com.foo.driver.bar; classes have instances:
(kernel) Kext com.foo.driver.bar class FooBarDriver has 1 instance.
(kernel) Kext com.foo.driver.bar class com_foo_driver_bar has 1 instance.
Failed to unload com.foo.driver.bar - (libkern/kext) kext is in use or retained (cannot unload).
これが発生した場合、(私が知っている)kextを「強制的にアンロード」する方法はありません。
実行中のOSカーネルによってメモリに保持されている参照のために、この単一のインスタンスがまだ存在していると推測するのは正しいですか?それは正しくないようです。なぜなら、それkextunload
は常に失敗するからです。では、なぜkextunload
すべてのドライバインスタンスを「完全に」アンロードするためにシステムの再起動が必要になることがあるのでしょうか。