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

I/O Registry

I/O Registry (также известный как IOReg) — это структура данных в операционной системе macOS, представляющая собой иерархическое описание всех устройств, драйверов и сервисов, подключённых к системе или зарегистрированных в ядре XNU. I/O Registry является частью подсистемы I/O Kit — объектно-ориентированного фреймворка для разработки драйверов устройств, используемого в macOS и iOS. Данные реестра отображают отношения «родитель-потомок» между объектами ввода-вывода, что позволяет анализировать аппаратную конфигурацию, загрузку драйверов и состояние устройств без прямого обращения к физическому оборудованию.

История и развитие

I/O Registry был введён компанией Apple вместе с I/O Kit в операционной системе Mac OS X 10.0 (Cheetah), выпущенной в марте 2001 года. До этого в классической Mac OS (до версии 9) управление устройствами осуществлялось через более простые механизмы, такие как Name Registry и драйверы на основе Deferred Task. Переход на I/O Kit и I/O Registry был обусловлен необходимостью поддержки многозадачности, защищённой памяти и универсальной модели драйверов для широкого спектра устройств — от встроенных контроллеров до периферии FireWire и USB.

В последующих версиях macOS реестр расширялся: появились поддержка новых шин (PCI Express, Thunderbolt, NVMe), улучшенная диагностика для графических процессоров и встроенных датчиков. Начиная с macOS 10.7 (Lion), утилита ioreg получила возможность вывода данных в формате XML. В macOS 10.15 (Catalina) была добавлена фильтрация по классам и свойствам через аргументы командной строки.

Структура и принцип работы

I/O Registry организован как плоское дерево объектов, каждый из которых имеет уникальный идентификатор (registry entry ID) и набор свойств (properties). Свойства представляют собой пары «ключ-значение», где ключ — строка, а значение может быть числом, строкой, массивом, словарём или данными (data). Основные типы объектов в реестре:

  • nubs — точки подключения, представляющие шины или контроллеры (например, IOUSBNub, IOPCINub);
  • drivers — загруженные драйверы устройств (например, IOUSBFamily, AppleIntelHDGraphics);
  • services — сервисы, предоставляемые драйверами (например, IOHIDSystem, IOAudioDevice);
  • providers — объекты, предоставляющие ресурсы другим объектам (например, AppleACPIPlatformExpert).

Иерархия строится по принципу: родительский объект (provider) предоставляет доступ к дочерним объектам (nubs), которые затем связываются с драйверами. Например, контроллер PCI Express является родителем для моста PCI, который, в свою очередь, является родителем для сетевого адаптера.

Плоское представление

Хотя логически реестр является деревом, команда ioreg по умолчанию выводит его в виде плоского списка с отступами, где каждый уровень отступа соответствует уровню вложенности. Это упрощает чтение, но может затруднять поиск конкретных устройств. Для отображения полного дерева используется флаг -w0.

Доступ к I/O Registry

Команда ioreg

Основным инструментом для работы с I/O Registry в macOS является утилита командной строки ioreg. Она входит в состав любой установки macOS и доступна через Терминал. Основные опции:

  • -l — вывод подробной информации (включая все свойства);
  • -r — рекурсивный обход дочерних объектов;
  • -c <класс> — фильтрация по имени класса (например, -c IOUSBDevice);
  • -n <имя> — фильтрация по имени объекта;
  • -p <путь> — поиск по пути в дереве;
  • -w0 — отключение переноса строк в выводе;
  • -x — вывод в формате XML (начиная с macOS 10.7).

Пример использования: ``bash ioreg -l -c IOUSBDevice ` Эта команда выводит все объекты класса IOUSBDevice` с их свойствами, включая идентификаторы производителя и продукта, версию прошивки и серийный номер.

Программный доступ

Разработчики могут получать доступ к I/O Registry через I/O Kit API на языке C++ или через обёртки на Swift/Objective-C. Основные функции:

  • IOServiceGetMatchingServices() — поиск сервисов по критериям;
  • IORegistryEntryCreateCFProperties() — получение свойств объекта;
  • IORegistryEntryGetPath() — получение пути в реестре.

Пример на Swift с использованием фреймворка IOKit: ```swift import IOKit

let matching = IOServiceMatching("IOUSBDevice") var iterator: io_iterator_t = 0 IOServiceGetMatchingServices(kIOMainPortDefault, matching, &iterator)

var service: io_object_t while (IOIteratorNext(iterator) != 0) { // обработка объекта } IOObjectRelease(iterator) ```

Применение

Диагностика оборудования

I/O Registry используется системными администраторами и разработчиками для диагностики проблем с оборудованием. Например, если устройство не определяется системой, можно проверить, присутствует ли соответствующий объект в реестре, и какие свойства у него установлены. Отсутствие объекта может указывать на неисправность шины, неправильные драйверы или конфликт ресурсов.

Разработка драйверов

При разработке драйверов для macOS I/O Registry служит основным источником информации о подключённых устройствах. Драйвер регистрируется в реестре при загрузке и предоставляет сервисы, которые могут использоваться другими компонентами системы. Свойства реестра позволяют драйверу получать параметры конфигурации (например, идентификаторы PCI, адреса памяти) и сообщать о своём состоянии.

Анализ производительности

Инструменты мониторинга, такие как fs_usage и sc_usage, могут использовать I/O Registry для отслеживания активности устройств. Например, по реестру можно определить, какие драйверы обрабатывают прерывания, и оценить нагрузку на шину ввода-вывода.

Судебная экспертиза и безопасность

В цифровой криминалистике I/O Registry позволяет восстановить историю подключения устройств к компьютеру. Свойства объектов могут содержать серийные номера, даты первой регистрации и другие метаданные. Однако следует учитывать, что реестр не хранит историю отключённых устройств — данные о них удаляются после извлечения.

Ограничения и особенности

  • Динамичность: I/O Registry обновляется в реальном времени при подключении или отключении устройств. Данные не сохраняются между перезагрузками системы.
  • Зависимость от драйверов: Если драйвер не загружен, соответствующий объект может отсутствовать в реестре, даже если устройство физически подключено.
  • Сложность интерпретации: Из-за большого числа объектов (тысячи записей) и недокументированных свойств анализ реестра требует глубоких знаний архитектуры I/O Kit.
  • Отсутствие в Windows и Linux: Аналогом I/O Registry в Windows является диспетчер устройств (Device Manager) и реестр драйверов, а в Linux — файловая система /sys и udev. Однако эти системы имеют другую архитектуру и не предоставляют столь детального дерева объектов.

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

  • Утилита ioreg может выводить данные в формате XML, который затем можно обрабатывать с помощью парсеров, таких как plist в Python или NSPropertyListSerialization в Objective-C.
  • В macOS существует скрытый инструмент IORegistryExplorer.app, который предоставляет графический интерфейс для просмотра реестра. Он входит в состав пакета Additional Tools for Xcode.
  • Некоторые вредоносные программы для macOS используют I/O Registry для обнаружения виртуальных машин или инструментов анализа, проверяя наличие определённых объектов (например, IOVM или VMware).
  • В iOS I/O Registry также существует, но доступ к нему ограничен из-за песочницы приложений. Полный доступ имеют только системные процессы и джейлбрейк-инструменты.

Источники

  • Apple Inc. I/O Kit Fundamentals. — 2020.
  • Singh A. Mac OS X Internals: A Systems Approach. — Addison-Wesley, 2006.
  • Документация man-страницы для ioreg (macOS).
  • Техническое описание I/O Kit на сайте Apple Developer.

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

На главную BFOmetr →