DriverKit
DriverKit — это программный фреймворк, разработанный компанией Apple Inc., предназначенный для создания драйверов устройств, работающих в пользовательском пространстве (user-space) операционной системы. В отличие от традиционных драйверов, которые выполняются в ядре операционной системы, драйверы на базе DriverKit функционируют в изолированной среде, что повышает стабильность и безопасность системы.
История
Предпосылки создания
До появления DriverKit разработка драйверов для macOS велась с использованием фреймворка I/O Kit, который требовал выполнения кода в пространстве ядра. Такой подход, хотя и обеспечивал высокую производительность, был сопряжён с рисками: ошибка в драйвере могла привести к краху всей операционной системы. Кроме того, для разработки драйверов требовалась глубокая квалификация в программировании ядра, а сам процесс был сложен и требователен к ресурсам.
Анонс и внедрение
DriverKit был анонсирован на Всемирной конференции разработчиков Apple (WWDC) в 2019 году в рамках презентации macOS 10.15 Catalina. Основной целью было упрощение разработки драйверов и повышение безопасности системы за счёт выноса драйверов из ядра. Первоначально фреймворк поддерживал ограниченный набор типов устройств: USB, Serial (последовательные порты) и Networking (сетевые устройства). В последующих версиях macOS, включая macOS 11 Big Sur, macOS 12 Monterey и macOS 13 Ventura, функциональность DriverKit была расширена, добавив поддержку PCI, Audio и HID (Human Interface Devices — устройства ввода, такие как клавиатуры и мыши).
Архитектура и принципы работы
User-space драйверы
DriverKit позволяет драйверам выполняться в пользовательском пространстве, что означает их изоляцию от ядра операционной системы. Каждый драйвер запускается в отдельном процессе (де-факто — в отдельном XPC-сервисе), который имеет ограниченные права доступа к системным ресурсам. Взаимодействие с ядром осуществляется через специальные системные вызовы и механизмы межпроцессного взаимодействия (IPC), предоставляемые фреймворком.
Изоляция и безопасность
Основное преимущество архитектуры DriverKit — повышенная безопасность. Если драйвер, работающий в пользовательском пространстве, даёт сбой или содержит уязвимость, это не приводит к краху ядра. Операционная система может перезапустить проблемный драйвер или изолировать его влияние. Кроме того, драйверы на DriverKit подписываются цифровой подписью разработчика и проверяются системой на соответствие политикам безопасности, что снижает риск установки вредоносного кода.
Производительность
Несмотря на дополнительный уровень абстракции, производительность драйверов DriverKit сопоставима с традиционными kernel-драйверами для большинства задач. Это достигается за счёт оптимизированного IPC и прямого доступа к аппаратным ресурсам через механизмы, предоставляемые ядром. Однако для устройств, требующих минимальных задержек (например, высокоскоростных сетевых адаптеров или аудиоинтерфейсов реального времени), разработчики могут выбирать гибридные подходы, сочетая DriverKit с элементами kernel-расширений.
Классификация и типы драйверов
DriverKit поддерживает несколько категорий драйверов, каждая из которых предназначена для определённого класса устройств:
- USB Driver — для устройств, подключаемых через шину USB (принтеры, сканеры, внешние накопители, MIDI-контроллеры и т.д.).
- Serial Driver — для последовательных портов (RS-232, UART), используемых в промышленном оборудовании, научных приборах и старых периферийных устройствах.
- Networking Driver — для сетевых адаптеров (Ethernet, Wi-Fi, Bluetooth), включая виртуальные сетевые интерфейсы.
- PCI Driver — для устройств, подключаемых через шину PCI/PCIe (видеокарты, звуковые карты, контроллеры хранения данных). Поддержка добавлена в macOS 11 Big Sur.
- Audio Driver — для аудиоустройств (внешние звуковые карты, микрофоны, наушники). Поддержка добавлена в macOS 12 Monterey.
- HID Driver — для устройств ввода (клавиатуры, мыши, джойстики, сенсорные панели). Поддержка добавлена в macOS 13 Ventura.
Разработка драйверов
Инструментарий
Для разработки драйверов на DriverKit используется среда Xcode, включающая специальные шаблоны проектов. Код пишется на языке Swift или Objective-C, с использованием фреймворка DriverKit, который предоставляет API для взаимодействия с устройствами. Разработка ведётся в контексте расширения (DriverKit extension), которое устанавливается в систему как отдельный пакет.
Процесс создания
- Определение типа устройства — выбор соответствующего подфреймворка (например,
USBDriverKit,PCIDriverKit). - Реализация драйвера — создание класса, наследующего от базового класса
IOService, и переопределение методов для инициализации, настройки и передачи данных. - Подпись и упаковка — драйвер подписывается сертификатом разработчика Apple и упаковывается в
.driverkit-расширение. - Тестирование — драйвер тестируется на совместимость с целевыми устройствами и версиями macOS.
- Распространение — драйвер может распространяться через App Store (в составе приложения) или напрямую через установочный пакет.
Ограничения
DriverKit не поддерживает драйверы для устройств, требующих прямого доступа к физической памяти или обработки прерываний на уровне ядра. Также фреймворк не предназначен для разработки драйверов для систем хранения данных (дисковых контроллеров) и графических процессоров — эти задачи остаются в компетенции kernel-расширений.
Применение
Периферийные устройства
DriverKit широко используется для создания драйверов для внешних устройств, подключаемых через USB или последовательный порт. Примеры: драйверы для лабораторного оборудования, медицинских приборов, промышленных контроллеров, а также для аудиоинтерфейсов профессионального уровня.
Сетевые адаптеры
Фреймворк позволяет создавать драйверы для сетевых устройств, включая виртуальные сетевые интерфейсы (например, VPN-адаптеры или эмуляторы сетевых карт). Это упрощает интеграцию стороннего сетевого оборудования в macOS.
Игровые контроллеры и HID-устройства
С поддержкой HID DriverKit разработчики могут создавать драйверы для игровых контроллеров, джойстиков и специализированных устройств ввода, не прибегая к kernel-расширениям.
Критика и ограничения
Совместимость
На момент выхода DriverKit поддерживал только ограниченный набор устройств, что вызывало критику со стороны разработчиков, работающих с нестандартным оборудованием. Расширение поддержки до PCI и Audio заняло несколько лет, и некоторые типы устройств (например, графические ускорители) по-прежнему требуют kernel-расширений.
Производительность
Для высоконагруженных устройств (например, высокоскоростных NVMe-накопителей) драйверы на DriverKit могут уступать в производительности kernel-драйверам из-за накладных расходов на IPC. Однако для большинства потребительских устройств разница незаметна.
Сложность миграции
Разработчики, ранее использовавшие I/O Kit, столкнулись с необходимостью переписывать код под новую архитектуру. Это потребовало времени и ресурсов, особенно для сложных драйверов с глубокой интеграцией в ядро.
Сравнение с альтернативами
DriverKit vs I/O Kit
- Безопасность: DriverKit обеспечивает изоляцию от ядра, I/O Kit — нет.
- Производительность: I/O Kit быстрее для задач с низкими задержками.
- Сложность: DriverKit проще в разработке и отладке.
- Поддержка: I/O Kit поддерживает больше типов устройств, но постепенно вытесняется DriverKit.
DriverKit vs Linux UIO/VFIO
В Linux аналогичные концепции реализованы через UIO (Userspace I/O) и VFIO (Virtual Function I/O). DriverKit предоставляет более интегрированное решение в экосистеме Apple, но менее гибкое для нестандартных сценариев.
Будущее развития
Apple продолжает расширять функциональность DriverKit, добавляя поддержку новых типов устройств и улучшая производительность. Ожидается, что в будущих версиях macOS фреймворк полностью заменит I/O Kit для большинства категорий драйверов, за исключением критически важных для системы. Разработчикам рекомендуется переходить на DriverKit для новых проектов, чтобы обеспечить совместимость с актуальными версиями macOS.
Источники
- Документация Apple Developer: DriverKit Framework Reference
- Сессия WWDC 2019: «Introducing DriverKit»
- Сессия WWDC 2020: «What's New in DriverKit»
- Статья «Building a Driver with DriverKit» на сайте Apple Developer
- Техническая документация macOS Kernel Programming Guide
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →