Драйвер IOKit загружен, но не запущен

У меня есть базовый драйвер 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>

но я, честно говоря, не знаю почему, любое объяснение будет высоко оценено.

Благодарность !


person Community    schedule 03.01.2018    source источник


Ответы (1)


Я могу только предполагать, потому что вы еще не предоставили полную информацию - в частности, вы не предоставили полные словари личности IOKit для ваших двух драйверов.

Обратите внимание, что обычно только одна служба успешно сопоставляет IOService, чтобы стать ее клиентом. Если вы хотите, чтобы несколько разных типов клиентов соответствовали друг другу, им необходимо определить различные категории соответствия с помощью ключа IOMatchCategory в словаре личности. Многие драйверы должны точно соответствовать IOResources, поэтому Правило для этого случая - использовать идентификатор пакета в качестве категории соответствия. Я подозреваю, что это то, что вам не хватало?

Наконец, что касается вашего бокового примечания о проблемах с ядрами выпуска по умолчанию: комплекты отладки ядра (KDK) предоставляют альтернативные ядра разработки и отладки, которые скомпилированы с гораздо менее агрессивной оптимизацией. настройки. Вы можете найти их полезными - ознакомьтесь с документацией KDK readme, чтобы узнать, как их включить.

person pmdj    schedule 03.01.2018
comment
да, это именно то, что мне было нужно, после установки разных значений IOMatchCategory для каждого из драйверов, они оба загрузились и их соответствующие классы предоставлены IOResources. Благодарность ! - person ; 04.01.2018