2016-04-06 8 views
3

У меня есть рабочее расширение ядра OSX, которое я хотел бы как можно раньше автоматически загружать во время загрузки. Kext использует KAUTH для контроля доступа по определенному пути, поэтому мне кажется, что не будет ничего, что попросит его загрузить в ядро. В этом случае копирование в /Library/Extensions (по крайней мере с тех пор, как Yosemite это рекомендуемый путь для сторонних расширений) не решит мою проблему.Загрузить ОС X kext в начале процесса загрузки

Есть ли возможность достичь этого, вне зависимости от того, изменяете ли код или какую-либо вспомогательную конфигурацию?

Я уже читал об использовании демона launchd для загрузки kextload, чтобы загрузить расширение, как указано в this question, но в моем случае я хочу, чтобы он был загружен как можно раньше.

Update:
Я использую "родовое" расширение ядра (связанное с библиотекой BSD) и не I/O Kit основан один.
Я хочу, чтобы мое расширение было загружено до запуска launchd.

+0

Привет, У меня есть одна и та же проблема, за исключением того, что я также хочу, чтобы мой kext загружался в безопасном режиме загрузки. Загружен ли ваш драйвер в безопасную загрузку как Что ж ? – Zohar81

+0

Я могу загрузить драйвер в безопасную загрузку, все это благодаря клавише 'OsBundleRequired', установленному в файле' Info.plist'. В настоящее время я использую 'Root', но я помню работу с другими значениями. Выберите то, что лучше всего подходит вам из одного из значений, упомянутых в [документации] (https://developer.apple.com/library/content/documentation/Darwin/Conceptual/KEXTConcept/Articles/infoplist_keys.html) – MathPlayer

+0

, когда вы говорите " безопасный режим "означает ли вы режим восстановления?потому что я видел, что при загрузке из режима восстановления (нажатие команды + R при запуске) мой kext даже не найден в '/ Library/Extensions' – Zohar81

ответ

4

Вы явно не указать это в вопросе, но я заключаю из контекста, что вы используете «общее» расширение ядра (в отличии от комплекта для ввода/вывода основанный)? Они загружаются либо из-за того, что от них зависит другой kext, либо потому, что они явно загружаются через kextutil/kextload или API KextManager.

Контрастируйте это с комплектом I/O Kit kexts, которые загружаются по требованию, когда один из их личностных словарей соответствует зарегистрированной службе в реестре ввода-вывода. Обычно это относится к управлению определенными устройствами, но различные не зависящие от оборудования системные службы используют механизм для соответствия «IOResources» nub (documentation), который появляется во время ранней загрузки, поэтому любые kexts, перечисляющие его как поставщика для личности, также загружаются на ботинке.

Таким образом, решение было бы изменить ваш kext, чтобы обеспечить IOService, который соответствует набору IOResources. Сама услуга действительно не нужна, если ваш компонент пользовательского пространства уже использует другой интерфейс для связи с kext.

Если вы не хотите изменять сам код kext, вы можете создать фиктивный kext, который сделает это, но объявит ваш основной kext как зависимость. Этот последний метод не является особенно элегантным, но должен работать, если по какой-то причине изменение существующего kext невозможно. (Хотя вам, вероятно, потребуется изменить info.plist)

+0

Да, я пытаюсь использовать общее расширение ядра, а не одно в зависимости от набора I/O, я обновлю вопрос. Интересно, что даже я делаю расширение фиктивного ввода I/O Kit, которое перечисляет в файле 'Info.plist' свой общий kext как зависимость, загрузка выполняется после запуска запуска, вопреки тому, чего я пытаюсь достичь. – MathPlayer

+1

Чтобы ваш kext был добавлен к предварительно связанному ядру, вы можете злоупотреблять свойством OSBundleRequired. Это сообщает ОС, что это необходимо для загрузки; обычно используемые драйверами устройств хранения данных и т. д. Подробнее см. https://developer.apple.com/library/mac/documentation/Darwin/Conceptual/KEXTConcept/Articles/infoplist_keys.html. – pmdj

+0

Я знал об объекте 'OSBundleRequired'. Я решил свою проблему, изменив расширение на набор ввода-вывода, основанный на указанном наборе свойств. У меня были некоторые проблемы с именованием, похоже, что имя для словаря IOKitPersonality' должно быть идентично имени расширения. – MathPlayer

0

Если kext получен из IOKit и находится в /Library/Extensions, очистите кэш и он будет автоматически загружен при загрузке. Вы очистить кэш, вызвав

kextcache -f -update-volume/
+0

@ TheDarkNight Я уже пытался перестроить кеш с помощью команды kextcache, которую вы упомянули, с удалением всего содержимого из '/ System/Library/Caches/com.apple.kext.caches' перед запуском команды, ни одна из комбинаций. – MathPlayer

+0

Он предназначен для работы таким образом. Вы проверили системные журналы, чтобы узнать, сообщают ли они о каких-либо проблемах с загрузкой kext? – TheDarkKnight

+0

Это будет работать только в том случае, если kext основан на соответствии набора входов/выходов. Я напишу отдельный ответ, чтобы объяснить более подробно. – pmdj