Невозможно выгрузить расширение ядра; У классов есть экземпляры
пишу расширение ядра OSX для драйвера аудиоустройствас программным обеспечением, но эмулирует аппаратное устройство).
Во время разработкиБыло бы удобно полностью удалить существующие старые версии, а затем собрать и установить новую версию с нуля. Однако иногда это кажется невозможным без перезагрузки системы.
Сама программа не запущена, а исходные файлы были удалены из/System/Library/Extensions/
реж.
Ноkextstat
раскрывает один случай:
$ kextstat | grep 'com.foo.driver.bar'
219 0 0xfff123 0x5000 0x5000 com.foo.driver.bar (0.0.1)
(...имея в виду:)
Index Refs Address Size Wired Name (Version)
Так что в моем экземпляре драйвера есть 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 (что я знаю).
Правильно ли я догадываюсь, что этот единственный экземпляр все еще существует из-за ссылки, хранящейся в памяти работающего ядра ОС? Это некажется правильным, потому что тогдаkextunload
всегда будет терпеть неудачу. Так почему жеkextunload
только иногда требуется перезагрузка системыот корки до корки" выгрузить все экземпляры драйверов?