Ne peut pas Décharger l'Extension du Noyau; les Classes Ont des Instances

Je suis en train d'écrire un OSX extension du noyau pour un pilote de périphérique audio (c'est un logiciel, mais émule un périphérique).

Au cours du développement, il serait commode de désinstaller complètement les versions, puis de construire et d'installer la nouvelle version à partir de zéro. Toutefois, cela semble parfois ne pas être possible sans un redémarrage du système.

Le programme lui-même n'est pas en cours d'exécution et la source des fichiers ont été supprimés de la /System/Library/Extensions/ dir.

Mais kextstat révèle une instance unique:

$ kextstat | grep 'com.foo.driver.bar'
219 0 0xfff123 0x5000 0x5000 com.foo.driver.bar (0.0.1) <102 5 4 3>

(...sens:)

Index Refs Address Size Wired Name (Version) <Linked Against>

Donc, il y a 0 Refs à mon instance de pilote, mais kextunload parfois échouer, de se plaindre des instances existantes:

$ 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).

Lorsque cela se produit, il n'y a aucun moyen de "forcer" décharger le kext (que je connais).

Suis-je droit à deviner que cette instance unique existe encore en raison d'une référence à la mémoire par le noyau de système d'exploitation? Cela ne semble pas juste, car alors kextunload serait toujours voués à l'échec. Alors, pourquoi ne kextunload que parfois nécessiter un redémarrage du système à "pleinement" décharger tous les pilote instances?

OriginalL'auteur pje | 2012-11-23