Решение, создать ли расширение ядра
Часто существуют более безопасные, более простые альтернативы созданию расширения ядра (kext). Важно удостовериться, создавая kext, абсолютно необходимо прежде, чем сделать так.
Удостоверьтесь, что Ваш код должен работать в пространстве ядра
Единственная причина записать kext вместо приложения пользовательского уровня или плагина состоит в том, чтобы использовать функциональность, которая уникальна для пространства ядра. Следующие случаи требуют резидентного ядром кода:
Основной клиент Вашего кода находится в ядре. Файловая система и драйверы сетевого устройства попадают в эту категорию.
Ваш код должен обработать основное прерывание (прерывание CPU, сгенерированное аппаратными средствами). Много драйверов устройств попадают в эту категорию: сетевые контроллеры, графические драйверы, драйверы аудио, и т.д. Драйвер устройства USB или FireWire не требует kext, если его клиент не находится в ядре.
Большое количество приложений требует ресурса, который обеспечивает Ваш код.
Если Ваш код не удовлетворяет ни одного из вышеупомянутых критериев, не пишите kext. Используйте одно из следующих решений пользовательского уровня вместо этого:
При разработке USB или драйвера устройства FireWire Набор I/O обеспечивает интерфейс для связи с USB и устройствами FireWire от пространства пользователя. Посмотрите Руководство по Интерфейсу Устройства Руководства и FireWire Интерфейса USB-устройства.
Если Вы разрабатываете персистентное фоновое приложение, не требующее полномочий ядра, пишущее демону. См. Руководство по программированию Демонов и Служб.
Соблюсти осторожность
Если Вы решили, что kext является надлежащим решением для Вашей проблемы, имейте в виду, что разработка kext является более опасной и более трудной, чем разработка приложения пользовательского уровня по многим причинам, включая следующее:
Kexts сокращают память, доступную пользовательским программам, потому что код пространства ядра требует соединенной проводом памяти (это не может быть разбито на страницы).
Среда выполнения ядра имеет еще много ограничений, чем среда выполнения пространства пользователя, и они должны сопровождаться тщательно для предотвращения ошибок. См. Руководство по программированию Ядра для подробных данных.
Программные ошибки в kext намного более серьезны, чем ошибки в коде пользовательского уровня. Код пространства ядра работает в привилегированном режиме, и это не имеет никакой защиты из памяти ошибки. Следовательно, ошибка доступа к памяти в kext вызывает панику ядра, разрушающую операционную систему.
Отладка kexts является более трудной, чем отладка программ пользовательского уровня, потому что это требует, чтобы две машины и дополнительные шаги установили сеанс отладки.
Для соображений безопасности некоторые клиенты ограничивают использование третьего лица kexts.