вторник, 9 ноября 2010 г.

Что такое KEXT?

Kext - это сокращение от kernel extension (расширение ядра) , разновидность пакета (bundle), содержащего исполняемый код (один или ни одного файла), ресурсы и плагины (плагины, тоже в формате bundle). C точки зрения файловой организации кекст это папка с расширением .kext, в которой лежит особым образом оформленный файл свойств пакета (./Contents/Info.plist), исполняемый файл расширения ядра (./Contents/MacOS/), ресурсы (./Contents/Resources/) и плагины (./Contents/Plugins/). Обычно Finder не показывает содержимое пакетов при навигации по папкам (исключение составляют frameworks). Для просмотра содержимого кекстов в контекстном меню файла необходимо выбрать пункт Show Package Contents (Показать содержимое пакета), после чего Finder покажет содержимое папки в новом окне.

Кекст это папка, поэтому при работе с ним в терминале не забывайте добавлять ключ "-R" для рекурсивного выполнения команд.

С точки зрения простого пользователя все кексты можно разделить на две большие группы: "настоящие" кексты (kext) и "легаси"-кексты (legacy kext).
"Настоящие" кексты - это расширения ядра, в которых есть исполняемый файл.

Легаси кексты - по сути не являются расширениями ядра в полном смысле этого слова. У них нет собственного исполняемого файла. Вместо этого, они содержат конфигурационные файлы для других, уже существующих в системе кекстов. Легаси кексты нужны для расширения функциональности системных кекстов (как правило, драйверов оборудования), путем добавления настроек специфичных для конкретного оборудования. Легаси бывают на звук, сеть, диски и другие устройства.

Ядро MacOS X Darwin вобрало в себя лучшее сразу от несколько технологий. Формально оно состоит из трех частей: подсистема BSD, микроядро mach и объектно-ориентированная среда разработки драйверов IOKit. Подсистема BSD основана на ветке 4.4, но при этом она значительно переработана и многие внутренние механизмы сильно отличаются от ядра FreeBSD, не смотря на использование одинаковых структур данных. Микроядро mach 3, также доработано и оптимизировано для обеспечения взаимодействия BSD и IOKit. IOKit - это объктно-ориентированный системный фреймворк, являющийся основой драйверов реальных устройств.

С точки зрения программиста кексты можно разделить на generic kernel extension и IOKit extension. Отличаются они "технологией изготовления" и целевым назначением. В своей документации Apple четко разграничивает (правда, в рекомендательной форме) назначение generic и IOKit расширений.

Generic расширения взаимодействуют с BSD подсистемой ядра. Они применятся для дополнения и расширения функционала ядра, например, добавление нового стека сетевых протоколов, не поддерживаемых ядром по умолчанию. Хотя для кардинального изменения подсистем ядра проще переписать или подправить само ядро, благо оно доступно в исходниках.

IOKit расширения предназначены для создания драйверов реальных или виртуальных устройств. IOKit предоставляет множество дополнительных функциональных возможностей (особое подмножество C++, широкий набор вспомогательных классов, семейства устройств), что сильно облегчает и ускоряет процесс создания драйвера.

Generic расширения тоже можно использовать для создания драйверов виртуальных устройств, как, например, это сделано в VitrualBox для сетевых драйверов.

Ссылки:

1) Введение в кексты (Kext concept)

2) Основы IOKit (IOKit Fundamentals)

3) Сетевой драйвер VirtualBox

1 комментарий: