У меня есть базовый драйвер IOKit, который не запускается аппаратно и происходит из IOResources. он также предоставляет клиентский класс пользовательского пространства с использованием IOServiceOpen
, но я думаю, что это не имеет отношения к моей проблеме ... Основной драйвер имеет зависимость IOKit, как указано в производном файле драйвера Info.plist:
<key>OSBundleLibraries</key>
<dict>
...
..
.
<key>com.derived.driver</key>
<string>1.0.0</string>
</dict>
другой драйвер (обозначенный com.derived.driver
) реализован как общее расширение ядра и хранится в /Library/Extensions
.
Когда я загружаю базовый драйвер, производный загружается автоматически. поскольку производный драйвер находится в /Library/Extensions
, он также может быть загружен перед запуском производного драйвера с помощью kextcache
.
Однако он перестает работать, когда я конвертирую производный драйвер из общего формата в формат IOKit, так что теперь оба драйвера IOProviderClass
равны IOResources
.
Похоже, что производный драйвер просто отказывается запускать его класс на основе IOService без каких-либо признаков ошибок в выходных журналах (я использовал отладчик и увидел, что он действительно достигает IOService::probeCandidates
, но не IOService::startCandidate
. Поскольку ядро скомпилировано с оптимизацией, я не мог за точный расход не трогаю).
Когда я смотрю на драйверы, загруженные в данный момент kextstat
, кажется, что оба драйвера загружены, но, согласно ioreg
, только базовый драйвер имеет активные экземпляры (я ожидал, что оба драйвера будут использовать одного и того же поставщика, то есть IOResources).
Более того, через некоторое время кажется, что вышестоящий драйвер просто удалили из загруженных кекстов (видимо из-за простоя) ..
Кажется ли мой дизайн законным, или мне также нужно изменить поле IOProviderClass
в базовом драйвере с IOResources
на класс производного драйвера, основанный на IOService.
<key>IOKitPersonalities</key>
<dict>
<key>myDriver</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.base.driver</string>
<key>IOClass</key>
<string>com_base_driver</string>
<key>IOProviderClass</key>
<string>com_derived_driver</string>
РЕДАКТИРОВАТЬ: Я действительно это сделал, и это сработало (все экземпляры были инициализированы в соответствии с ioreg).
+-o com_derived_driver <class com_derived_driver, id 0x10000091f, registered, matched, active, busy 0 (804415 ms), retain 6>
+-o com_base_driver <class com_base_mng, id 0x100000920, registered, matched, active, busy 0 (0 ms), retain 9>
но я, честно говоря, не знаю почему, любое объяснение будет высоко оценено.
Благодарность !