Подробный гайд: IOMMU — аппаратный механизм управления памятью ввода-вывода

IOMMU — аппаратный механизм трансляции адресов устройств ввода-вывода, защиты памяти от DMA-атак, изоляции устройств в ВМ. Настройка в Linux, Intel VT-d, AMD-Vi

2026.05.27                    


Подробный гайд: IOMMU — аппаратный механизм управления памятью ввода-выводаПодробный гайд: IOMMU — аппаратный механизм управления памятью ввода-вывода

Что такое IOMMU?

IOMMU (Input-Output Memory Management Unit) — это специализированный аппаратный блок, который выполняет трансляцию виртуальных адресов, видимых устройствами ввода-вывода, в физические адреса системной памяти. По своей функции он аналогичен традиционному MMU (Memory Management Unit) процессора, но работает для устройств, использующих прямой доступ к памяти (DMA).

СистемаСистема


Основные функции IOMMU

1. Трансляция адресов (Address Translation)

  • Преобразует IOVA (I/O Virtual Address) в физические адреса памяти
  • Позволяет устройствам работать с разрывными областями памяти без поддержки scatter-gather DMA

2. Защита памяти (Memory Protection)

  • Блокирует несанкционированный доступ устройств к памяти
  • Предотвращает DMA-атаки, когда злонамеренное устройство пытается прочитать/записать произвольные области памяти

3. Изоляция в виртуализации

  • Обеспечивает безопасный прямой доступ устройств к виртуальным машинам (PCI passthrough)
  • Каждая ВМ получает собственное адресное пространство для устройств

4. Отладка и диагностика

  • Генерация событий при ошибках доступа к памяти
  • Логирование нарушений для анализа

Архитектура и реализации

Intel: VT-d (Virtualization Technology for Directed I/O)

Компонент Описание
DMAR DMA Remapping Table — ACPI-таблица с описанием IOMMU
DRHD DMA Remapping Hardware Unit Definition — описание аппаратных блоков
RMRR Reserved Memory Region Reporting — области памяти для устройств BIOS

AMD: AMD-Vi (IOMMU)

Компонент Описание
IVRS I/O Virtualization Reporting Structure — аналог DMAR для AMD
IVHD I/O Virtualization Hardware Definition — описание устройств
IVDB I/O Virtualization Definition Block — дополнительные параметры

Важно: Для работы необходимо включить поддержку в BIOS/UEFI: Intel VT-d или AMD IOMMU / AMD-Vi


Режимы работы IOMMU в Linux

Linux поддерживает два основных режима работы подсистемы IOMMU:

Режим трансляции (DMA Translation Mode)

# Включение (по умолчанию для большинства систем)
intel_iommu=on      # для Intel
amd_iommu=on        # для AMD

Характеристики:

  • Каждое устройство получает собственное пространство виртуальных адресов (IOVA)
  • Ядро управляет отображениями через API dma_map_*() / dma_unmap_*()
  • Попытка доступа к не отображённой странице вызывает IOMMU page fault
  • Рекомендуется для: безопасности, виртуализации, peer-to-peer DMA

Режим прямого доступа (Pass-through Mode)

# Включение pass-through
intel_iommu=on iommu=pt    # Intel
amd_iommu=on iommu=pt      # AMD

Характеристики:

  • Трансляция адресов отключена, устройства работают с физическими адресами напрямую
  • Защита памяти и interrupt remapping остаются активными
  • Рекомендуется для: максимальной производительности, когда безопасность не критична
  • Не обеспечивает изоляцию памяти между устройствами

Полное отключение

iommu=off

Не рекомендуется:

отключает все функции защиты и изоляции. Используйте только для отладки или на старых системах.


Настройка IOMMU в Linux: пошагово

Шаг 1: Проверка поддержки оборудования

# Проверка поддержки VT-d / AMD-Vi в CPU
grep -E "vmx|svm" /proc/cpuinfo

# Проверка наличия таблиц ACPI
dmesg | grep -i "DMAR\|IVRS\|IOMMU"

# Проверка загруженного модуля
lsmod | grep iommu

Шаг 2: Включение в BIOS/UEFI

  1. Перезагрузите систему и войдите в BIOS/UEFI
  2. Найдите раздел Advanced → CPU Configuration или Virtualization
3. Включите:
  • Intel: Intel VT-d, Directed I/O Virtualization
  • AMD: AMD IOMMU, AMD-Vi, IOMMU Controller
    1. Сохраните настройки и перезагрузитесь

Шаг 3: Настройка параметров ядра

Редактируйте /etc/default/grub:

# Для Intel
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt"

# Для AMD  
GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt"

# Для полной трансляции (без pt)
GRUB_CMDLINE_LINUX="intel_iommu=on"

Примените изменения:

# Для систем с GRUB2
sudo update-grub          # Debian/Ubuntu
# или
sudo grub2-mkconfig -o /boot/grub2/grub.cfg  # RHEL/CentOS

sudo reboot

Шаг 4: Верификация

# Проверка активности IOMMU
dmesg | grep -i "IOMMU\|DMAR\|AMD-Vi"

# Пример вывода для Intel:
# PCI-DMA: Using DMAR IOMMU
# DMAR: IOMMU enabled

# Проверка устройств в группах IOMMU
find /sys/kernel/iommu_groups/ -type l

# Проверка текущего режима
cat /sys/kernel/iommu_groups/*/type

Использование IOMMU в виртуализации (KVM/QEMU)

Настройка хоста для PCI Passthrough

  1. Включите IOMMU (см. выше)
2. Проверьте изоляцию устройств:
# Устройства в одной группе IOMMU не могут быть разделены между ВМ
lspci -nn | grep -E "VGA|Ethernet|Storage"
find /sys/kernel/iommu_groups/ -type l | sort

3. Заблокируйте устройство от родного драйвера:
# Узнайте VID:PID устройства
lspci -nn | grep <устройство>

# Добавьте в параметры ядра (пример для NVIDIA GPU):
vfio-pci.ids=10de:1b81,10de:10f0

# Или создайте правило udev
echo "options vfio-pci ids=10de:1b81,10de:10f0" | sudo tee /etc/modprobe.d/vfio.conf

4. Запустите ВМ с пробросом устройства:
# Пример команды QEMU
qemu-system-x86_64 \
  -enable-kvm \
  -cpu host \
  -device vfio-pci,host=01:00.0,bus=pcie.0 \
  -m 8G -smp 4 \
  -hda /path/to/vm.img

Преимущества использования IOMMU в виртуализации:

  • Прямой доступ устройств к ВМ с аппаратной изоляцией
  • Защита хоста от сбоев или атак через устройства ВМ
  • Улучшенная производительность за счёт минимизации эмуляции
  • Поддержка прерываний с аппаратным ремэппингом

Диагностика и устранение неполадок

Частые проблемы и решения

Проблема Возможная причина Решение
Графические артефакты/зависания Конфликт IOMMU с интегрированной графикой Добавьте intel_iommu=igfx_off (Intel) или iommu=pt (AMD)
Устройство не определяется в ВМ Устройство не в отдельной IOMMU-группе Проверьте find /sys/kernel/iommu_groups/; возможно, требуется аппаратная поддержка ACS
Ошибки DMA в dmesg Неправильные настройки драйвера Проверьте, что драйвер использует dma_map_*() API
Система не загружается с iommu=on Устаревший драйвер или прошивка Обновите BIOS и ядро; временно используйте iommu=pt

Примеры сообщений об ошибках

Intel:
DMAR: [DMA Write] Request device [00:02.0] fault addr 6df084000
DMAR: [fault reason 05] PTE Write access is not set

AMD:
AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0007 address=0xffffc02000 flags=0x0000]
AMD-Vi: Event logged [IO_PAGE_FAULT device=07:00.0 domain=0x0007 address=0xffffc02000 flags=0x0000]

Совет: При отладке включите подробное логирование: intel_iommu=on,igfx_off debug или amd_iommu=on debug


Производительность: что нужно знать

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

Режим Накладные расходы Когда использовать
Translation 1-5% (TLB misses, page walks) Безопасность, виртуализация, отладка
Pass-through <1% (только interrupt remapping) Высокопроизводительные вычисления, GPU passthrough
Disabled 0% Только для отладки или на доверенном оборудовании

Оптимизация

# Включение huge pages для снижения TLB misses
echo 1 > /sys/kernel/iommu_groups/<id>/hugepage

# Использование lazy TLB invalidation (AMD)
# Устанавливается по умолчанию в современных ядрах

# Для графики: исключение интегрированного GPU
intel_iommu=igfx_off

Безопасность: защита от DMA-атак

IOMMU является критическим компонентом защиты от DMA-атак (например, через Thunderbolt, FireWire, PCIe):

Атака и защита без IOMMUАтака и защита без IOMMU


Рекомендация: Всегда включайте IOMMU на системах с внешними портами (Thunderbolt, USB4), особенно в корпоративной среде.


Дополнительные ресурсы

  • Спецификация Intel VT-d: intel.com/content/www/us/en/design/products/platforms/details/arrow-lake-s/core-ultra-200s-series-processors-datasheet-volume-1-of-2/intel-virtualization-technology-intel-vt-for-directed-i-o-intel-vt-d/
  • Спецификация AMD IOMMU: amd.com/system/files/TechDocs/48882_IOMMU.pdf
  • Документация ядра Linux: x86 IOMMU: kernel.org/doc/Documentation/arch/x86/iommu.rst
  • Lenovo Press: IOMMU в Linux: lenovopress.lenovo.com/lp1467-an-introduction-to-iommu-infrastructure-in-the-linux-kernel
  • AMD GPU Docs: IOMMU и peer-to-peer DMA: instinct.docs.amd.com/projects/amdgpu-docs/en/latest/conceptual/iommu.html

Итог:

IOMMU — это не просто «опция виртуализации», а фундаментальный механизм безопасности и управления памятью. Правильная настройка IOMMU обеспечивает баланс между производительностью, безопасностью и совместимостью. Начинайте с режима iommu=pt для тестирования, а для продакшена с виртуализацией используйте полный режим трансляции с регулярным мониторингом логов.


Информация предоставлена в ознакомительных целях. Применение описанных настроек в системах, должно осуществляться только после согласования с ответственными за информационную безопасность и в соответствии с требованиями ФСТЭК, ФСБ и иных уполномоченных органов.