Открыть сервис

IOKit

IOKit — это объектно-ориентированная подсистема ядра операционной системы macOS (ранее Mac OS X), разработанная компанией Apple Inc. Она предоставляет каркас (framework) для разработки драйверов устройств и управления ядром, реализованный на подмножестве языка C++ (так называемый Embedded C++). IOKit является частью XNU (X is Not Unix) — гибридного ядра, используемого в macOS, iOS, iPadOS, tvOS и watchOS.

История

Предпосылки создания

До появления Mac OS X в классической Mac OS (до версии 9) не было унифицированной модели драйверов. Разработчики использовали различные низкоуровневые API, такие как Device Manager и Name Registry, что приводило к фрагментации и проблемам совместимости. С переходом на микроядро Mach и ядро XNU в 2001 году (Mac OS X 10.0 Cheetah) потребовалась современная, гибкая и безопасная система управления устройствами.

Разработка и внедрение

IOKit был разработан в конце 1990-х годов под руководством Джонатана «Вольфа» Ренстрёма (Jonathan «Wolf» Rentschler) и впервые представлен в Mac OS X 10.0. Ключевой особенностью стала реализация на C++ с ограничениями: запрещены множественное наследование, исключения (exceptions), шаблоны (templates) и динамическое приведение типов (dynamic_cast). Это было сделано для обеспечения детерминированного поведения в контексте ядра, где недопустимы задержки и непредсказуемые выделения памяти.

Эволюция

С выходом Mac OS X 10.5 Leopard (2007) IOKit получил поддержку 64-битных драйверов. В macOS 10.15 Catalina (2019) Apple объявила о постепенном отказе от IOKit в пользу нового фреймворка DriverKit, который позволяет запускать драйверы в пользовательском пространстве (user space) для повышения стабильности системы. Однако IOKit остаётся основным механизмом для написания драйверов ядра в macOS до версии 11 Big Sur и выше, а также используется в iOS для встроенных устройств.

Архитектура

Основные принципы

IOKit построен на объектно-ориентированной модели, где каждый драйвер представлен классом C++, наследуемым от базового класса IOService. Взаимодействие между драйверами и ядром осуществляется через механизм сообщений (messages) и провайдеров (providers). Драйверы регистрируются в реестре I/O Registry (I/O Kit Registry) — иерархической базе данных, описывающей все устройства и драйверы в системе.

Компоненты

  1. Ядро IOKit — базовая библиотека, содержащая классы для управления памятью, синхронизации, работы с очередями и таймерами.
  2. Семейства драйверов (families) — наборы классов для конкретных типов устройств: IOStorageFamily (диски), IONetworkFamily (сеть), IOHIDFamily (человеко-машинный интерфейс), IOAudioFamily (аудио), IOGraphicsFamily (графика) и другие.
  3. Пользовательский интерфейс — через IOKitLib (фреймворк IOKit в user space) приложения могут взаимодействовать с драйверами, например, для получения информации об устройствах или отправки команд.

Жизненный цикл драйвера

  1. Обнаружение устройства — ядро через Mach-сообщения или ACPI обнаруживает новое устройство.
  2. Создание экземпляра драйвера — ядро вызывает метод start() у класса драйвера, который инициализирует устройство.
  3. Работа — драйвер обрабатывает запросы ввода-вывода, прерывания и управление питанием.
  4. Завершение — при отключении устройства или выгрузке драйвера вызывается метод stop(), освобождающий ресурсы.

Классификация драйверов IOKit

По типу устройства

По месту выполнения

Применение

macOS

IOKit является основой для всех драйверов устройств в macOS. Примеры:

iOS и другие системы

В iOS IOKit используется для управления встроенными датчиками (акселерометр, гироскоп, компас), камерой, тачскрином и модулями связи. В watchOS и tvOS применяется аналогичная архитектура.

Разработка сторонних драйверов

До появления DriverKit разработчики могли создавать драйверы для macOS с помощью IOKit, используя Xcode и инструмент ioclasscount. После выхода macOS 11 Big Sur Apple рекомендует использовать DriverKit для новых драйверов, а IOKit — только для ядерных расширений (kext), которые не могут быть перенесены в user space (например, драйверы для специализированного оборудования).

Преимущества и недостатки

Преимущества

Недостатки

Интересные факты

Критика

IOKit критикуется за сложность и высокий порог входа для разработчиков. Из-за отсутствия официальной поддержки драйверов для стороннего оборудования (например, для некоторых видеокарт NVIDIA) пользователи macOS сталкиваются с ограничениями. Кроме того, закрытость архитектуры затрудняет создание драйверов для несертифицированного оборудования.

Источники

  1. Apple Inc. «Kernel Programming Guide: I/O Kit Fundamentals» (документация для разработчиков macOS).
  2. Amit Singh. «Mac OS X Internals: A Systems Approach» (Addison-Wesley, 2006) — глава 10 «I/O Kit».
  3. Jonathan Levin. «Mac OS X and iOS Internals: To the Apple’s Core» (Wiley, 2012) — раздел о драйверах.
  4. Официальная документация Apple Developer: «DriverKit» и «Kernel Extensions».
  5. Исходный код ядра XNU (Darwin) на GitHub (репозиторий Apple).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →