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 →