Ich schreibe eine OSX-Kernel-Erweiterung für einen Audiogerätetreiber (es handelt sich um Software, die jedoch ein Hardwaregerät emuliert).
Während der Entwicklung wäre es praktisch, vorhandene alte Versionen vollständig zu deinstallieren und dann die neue Version von Grund auf zu erstellen und zu installieren. Dies scheint jedoch gelegentlich ohne einen Systemneustart nicht möglich zu sein.
Das Programm selbst läuft nicht, und die Quelldateien wurden aus dem /System/Library/Extensions/
-Verzeichnis gelöscht.
Aber kextstat
zeigt eine einzige Instanz:
$ kextstat | grep 'com.foo.driver.bar'
219 0 0xfff123 0x5000 0x5000 com.foo.driver.bar (0.0.1) <102 5 4 3>
(...was bedeutet:)
Index Refs Adresse Größe Verdrahtet Name (Version)
Es gibt also 0 Refs zu meiner Treiberinstanz, aber kextunload
wird manchmal fehlschlagen und sich über vorhandene Instanzen beschweren:
$ sudo kextunload -b com.foo.driver.bar
(kernel) Kann kext com.foo.driver.bar nicht entladen; Klassen haben Instanzen:
(kernel) Kext com.foo.driver.bar Klasse FooBarDriver hat 1 Instanz.
(kernel) Kext com.foo.driver.bar Klasse com_foo_driver_bar hat 1 Instanz.
Entladen von com.foo.driver.bar fehlgeschlagen - (libkern/kext) kext wird verwendet oder beibehalten (kann nicht entladen werden).
Wenn dies passiert, gibt es keinen Weg, den kext "gewaltsam" zu entladen (den ich kenne).
Habe ich recht in der Vermutung, dass diese einzelne Instanz noch existiert, weil im laufenden Betriebssystemkern ein Verweis im Speicher gehalten wird? Das scheint nicht richtig zu sein, denn dann würde kextunload
immer fehlschlagen. Warum erfordert kextunload
also nur manchmal einen Systemneustart, um alle Treiberinstanzen "vollständig" zu entladen?