IOMMU
IOMMU (Input-Output Memory Management Unit) — это аппаратный компонент компьютерной системы, выполняющий функции управления памятью для устройств ввода-вывода (I/O). По аналогии с MMU (Memory Management Unit), который управляет доступом к памяти со стороны центрального процессора (CPU), IOMMU контролирует и преобразует адреса памяти, используемые периферийными устройствами (такими как сетевые карты, графические ускорители, контроллеры жёстких дисков), перед тем как эти запросы достигнут физической оперативной памяти (RAM). IOMMU обеспечивает изоляцию устройств, трансляцию адресов (DMA-ремаппинг) и повышение безопасности системы, предотвращая прямой доступ устройств к произвольным областям памяти.
История
Концепция IOMMU возникла как развитие технологии Direct Memory Access (DMA), которая позволяет устройствам обмениваться данными с памятью напрямую, минуя CPU. Однако отсутствие контроля над DMA-операциями создавало уязвимости: неисправное или вредоносное устройство могло читать или записывать данные в любую область памяти, включая ядро операционной системы.
Первые реализации IOMMU появились в серверных и мейнфреймовых архитектурах в 1990-х годах. Например, IBM System/390 использовала механизмы для изоляции устройств в виртуальных машинах. В архитектуре x86 массовое внедрение IOMMU началось с появлением технологий AMD-Vi (AMD I/O Virtualization Technology, представлена в 2006 году с процессорами Opteron) и Intel VT-d (Intel Virtualization Technology for Directed I/O, выпущена в 2006 году с чипсетами серии 5000). В архитектуре ARM IOMMU часто реализуется через System Memory Management Unit (SMMU), стандартизированный в спецификации ARMv8.
Устройство и принцип работы
IOMMU располагается на системной шине (например, PCI Express) между устройствами ввода-вывода и контроллером памяти. Основные компоненты IOMMU:
- Таблицы трансляции адресов (I/O page tables): структуры данных, аналогичные таблицам страниц MMU, которые отображают виртуальные адреса устройств на физические адреса памяти. Каждому устройству или группе устройств может быть назначена своя таблица.
- Контекстная память (context cache): кэш для быстрого поиска таблиц трансляции по идентификатору устройства (например, PCIe Requester ID).
- Кэш трансляций (IOTLB — I/O Translation Lookaside Buffer): кэш недавно использованных трансляций, ускоряющий преобразование адресов.
- Контроллер прерываний (interrupt remapping): модуль, перенаправляющий и проверяющий прерывания от устройств, предотвращая атаки через подделку прерываний (interrupt injection).
Процесс трансляции адреса
- Устройство (например, сетевая карта) инициирует DMA-операцию, передавая IOMMU виртуальный адрес (в контексте устройства — Bus Address).
- IOMMU использует идентификатор устройства (Bus/Device/Function) для поиска соответствующей таблицы страниц.
- Выполняется поиск в IOTLB. Если трансляция найдена — она применяется. Если нет — IOMMU обращается к таблицам страниц в оперативной памяти (page walk).
- Если виртуальный адрес отображается на допустимый физический адрес, и у устройства есть права доступа (чтение/запись), IOMMU подставляет физический адрес и передаёт запрос в контроллер памяти.
- Если трансляция не найдена или права нарушены — IOMMU генерирует исключение (DMA fault), которое обрабатывается драйвером или операционной системой.
Классификация
IOMMU можно классифицировать по архитектуре и способу интеграции:
По архитектуре
- Интегрированный в чипсет (Northbridge): традиционный подход для x86-систем (например, Intel VT-d в контроллере-концентраторе ввода-вывода).
- Интегрированный в процессор (SoC): распространён в мобильных и встраиваемых системах на ARM (SMMU) и AMD (AMD-Vi).
- Дискретный: отдельная микросхема, встречается редко, в основном в высоконадёжных серверах.
По типу виртуализации
- Тип 1 (Pass-through): устройство полностью передаётся виртуальной машине (VM) с использованием IOMMU для обеспечения изоляции. IOMMU транслирует адреса из адресного пространства VM в физическое.
- Тип 2 (Shared): устройство разделяется между несколькими VM или между VM и хостом. IOMMU управляет доступом к разным областям памяти для разных гостевых систем.
Применение
Виртуализация
IOMMU является ключевым компонентом для эффективной виртуализации ввода-вывода. Без IOMMU виртуальные машины не могли бы напрямую обращаться к физическим устройствам, что приводило бы к необходимости эмуляции или паравиртуализации (с накладными расходами). С IOMMU возможен PCI passthrough — передача физического устройства (например, графической карты или NVMe-накопителя) в гостевую VM с производительностью, близкой к нативной. Технологии Intel VT-d и AMD-Vi широко используются в гипервизорах (KVM, Xen, VMware ESXi, Hyper-V).
Безопасность
IOMMU предотвращает DMA-атаки, когда вредоносное устройство (например, подключённое через Thunderbolt или ExpressCard) пытается получить доступ к защищённой памяти ядра или других процессов. Операционные системы (Linux, Windows, macOS) могут включать IOMMU для блокировки несанкционированных DMA-операций. В Linux эта функция реализована через механизм iommu=force или iommu.passthrough.
- DMA remapping: IOMMU может ограничить доступ устройства только к тем областям памяти, которые ему явно выделены драйвером.
- Interrupt remapping: защита от атак на прерывания (MSI — Message Signaled Interrupts), когда устройство подделывает прерывание для выполнения кода в привилегированном режиме.
Производительность
В некоторых сценариях IOMMU может снижать производительность из-за накладных расходов на трансляцию адресов (page walks, кэширование). Однако современные реализации (с большими IOTLB и аппаратным ускорением) минимизируют задержки. В режиме passthrough (например, для GPU в задачах машинного обучения) IOMMU обычно не создаёт значительного замедления.
Поддержка в операционных системах
- Linux: поддержка IOMMU через подсистемы DMA API и IOMMU API. Для Intel VT-d используется модуль
intel-iommu, для AMD-Vi —amd_iommu. Настройка через параметры ядра (например,iommu=ptдля режима passthrough). - Windows: поддержка через Hyper-V и драйверы для виртуализации. Включение IOMMU в BIOS/UEFI может потребоваться для работы Device Guard и Credential Guard.
- macOS: использует IOMMU (Apple Silicon имеет собственный SMMU) для изоляции устройств в системе безопасности.
Ограничения и критика
- Аппаратная сложность: IOMMU увеличивает площадь кристалла и энергопотребление, особенно в мобильных устройствах.
- Совместимость: не все устройства корректно работают с IOMMU. Некоторые старые драйверы могут предполагать прямой доступ к памяти и выходить из строя при включённой трансляции.
- Производительность в некоторых сценариях: при высокой частоте DMA-операций с мелкими блоками данных (например, в высокоскоростных сетевых адаптерах) накладные расходы на трансляцию могут быть значительными. Для таких случаев существуют оптимизации, такие как использование больших страниц (2 МБ, 1 ГБ) в I/O page tables.
- Безопасность: сама по себе IOMMU не защищает от атак на уровне драйверов или уязвимостей в прошивке устройства. Она лишь ограничивает возможности устройства после его инициализации.
Интересные факты
- В архитектуре x86 IOMMU может быть отключён в BIOS/UEFI для повышения совместимости со старым оборудованием, что снижает безопасность системы.
- В процессорах AMD EPYC (серверная линейка) IOMMU поддерживает до 512 контекстов устройств и 512 уровней таблиц страниц.
- В мобильных процессорах Apple M1/M2 IOMMU (SMMU) используется для изоляции работы ускорителей (Neural Engine, GPU) и предотвращения утечки данных между приложениями.
- Технология IOMMU является обязательной для сертификации систем, поддерживающих виртуализацию по стандарту PCI-SIG SR-IOV (Single Root I/O Virtualization).
Источники
- Intel Corporation. Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 3: System Programming Guide. Chapter 10: Intel VT-d.
- Advanced Micro Devices. AMD I/O Virtualization Technology (IOMMU) Specification. Rev. 3.00.
- ARM Limited. ARM Architecture Reference Manual ARMv8. Chapter D8: System Memory Management Unit.
- KVM Forum. IOMMU and VFIO for Device Passthrough.
- Linux Kernel Documentation. Documentation/admin-guide/kernel-parameters.txt (параметры iommu).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →