Подробный гайд по IOMMU (Input/Output Memory Management Unit)

IOMMU — аппаратный модуль трансляции адресов для DMA-устройств. Обеспечивает изоляцию устройств, защиту от атак и поддержку PCIe passthrough в виртуализации.

2026.05.21                  


Подробный гайд по IOMMU (Input/Output Memory Management Unit)Подробный гайд по IOMMU (Input/Output Memory Management Unit) Для кого этот гайд: системные администраторы, разработчики драйверов, энтузиасты виртуализации, специалисты по информационной безопасности.
Уровень: от среднего до продвинутого.
ОС: фокус на Linux, но принципы универсальны.
Дата актуальности: 2026 г.


1. Что такое IOMMU и зачем он нужен

IOMMU (Input/Output Memory Management Unit) — аппаратный блок в чипсете/CPU, который обеспечивает трансляцию адресов и контроль доступа для устройств, использующих DMA (Direct Memory Access).


Основные задачи:

Задача Описание
DMA Remapping Трансляция IOVA (I/O Virtual Address) → физический адрес памяти
Изоляция устройств Запрет неавторизованного доступа к памяти других процессов/VM
Виртуализация Безопасный PCIe passthrough, SR-IOV, VFIO
Защита от атак Блокировка несанкционированного DMA (Thunderbolt, FireWire, rogue PCIe)
Interrupt Remapping Безопасное перенаправление MSI/MSI-X в виртуальные окружения

Аналогия:

MMU защищает CPU-процессы друг от друга. IOMMU делает то же самое для периферийных устройств.


2. Принцип работы

  1. Устройство формирует DMA-запрос с IOVA (виртуальный адрес, видимый устройству).
2. Запрос проходит через IOMMU, который:
  • Ищет трансляцию в таблицах (аналог page tables CPU)
  • Проверяет права доступа (read/write/exec)
  • Проверяет границы выделенного региона
    1. При успехе → запрос идёт к физической памяти. При ошибке → генерируется DMA Fault, устройство блокируется.
    2. Для ускорения используется IOTLB (I/O Translation Lookaside Buffer) — кэш трансляций.

[Device] → (IOVA) → [IOMMU] → (Physical Addr) → [RAM]
                ↑          ↑
           Tables (VT-d/AMD-Vi/SMMU)   IOTLB

3. Реализации от вендоров

Вендор Название Особенности
Intel VT-d Зрелая, широкая поддержка, интегрирована в чипсеты начиная с Nehalem
AMD AMD-Vi (IOMMU) Аналог VT-d, иногда требует amd_iommu=ivrs_ioapic[...] для legacy
ARM SMMU (v3/v3.1/v3.2) Обязателен в серверных SoC (Neoverse, Apple M-серия использует DART)
RISC-V IOMMU Spec Стандартизирован ~2023, набирает поддержку в Linux 6.x+
Apple DART Проприетарная реализация, используется в M1/M2/M3

Все современные реализации поддерживают Stage-1/Stage-2 translation, ATS (Address Translation Services), PRI (Page Request Interface).


4. Включение в BIOS/UEFI

  1. Зайдите в UEFI Setup (Del/F2 при загрузке)
2. Найдите разделы:
  • Advanced → System Agent (SA) Configuration → Intel VT-d
  • AMD CBS → NBIO Common Options → IOMMU Controller
  • PCI Subsystem Settings → Above 4G Decoding (рекомендуется Enabled)
  • PCIe ACS (оставьте Default или Enabled)
    1. Сохраните и перезагрузитесь

Отключение IOMMU в BIOS полностью отключает защиту и виртуализацию DMA. Не рекомендуется для серверов и рабочих станций.


5. Настройка в Linux

Параметры ядра (GRUB)

sudo nano /etc/default/grub
# Найдите GRUB_CMDLINE_LINUX_DEFAULT и добавьте:
GRUB_CMDLINE_LINUX_DEFAULT="... intel_iommu=on amd_iommu=on iommu=pt iommu.strict=0"
sudo update-grub

Параметр Описание
intel_iommu=on / amd_iommu=on Явное включение драйвера
iommu=pt Pass-through mode: устройства без виртуализации работают напрямую, без трансляции (снижает overhead)
iommu.strict=0 Lazy IOTLB flushing (улучшает производительность, чуть снижает строгость изоляции)
intel_iommu=igfx_off Отключает IOMMU для встроенной графики Intel (если вызывает артефакты)

Проверка работы

# Логи ядра
dmesg | grep -E "DMAR|IOMMU|amd-vi|SMMU"

# Проверка групп
find /sys/kernel/iommu_groups/ -type l | sort

# Поддержка в lspci
lspci -vv | grep -i "IOMMU\|DMA"

6. Виртуализация и PCIe Passthrough (VFIO)

Что такое VFIO?

VFIO (Virtual Function I/O) — фреймворк ядра Linux для безопасного проброса физических устройств в виртуальные машины. Заменяет устаревшие pci-stub и kvm-vfio.


Пошаговая настройка

# 1. Найдите BDF устройства (Domain:Bus:Device.Function)
lspci -nn | grep -i "VGA\|Network\|Storage"

# 2. Узнайте IOMMU группу
readlink /sys/bus/pci/devices/0000:01:00.0/iommu_group
# Вывод: ../../../../kernel/iommu_groups/12

# 3. Отвяжите от родного драйвера
echo "0000:01:00.0" | sudo tee /sys/bus/pci/devices/0000:01:00.0/driver/unbind

# 4. Привяжите к vfio-pci
echo "vfio-pci" | sudo tee /sys/bus/pci/devices/0000:01:00.0/driver_override
echo "0000:01:00.0" | sudo tee /sys/bus/pci/drivers/vfio-pci/bind

# 5. Запустите VM (пример QEMU)
qemu-system-x86_64 \
  -enable-kvm -cpu host -m 8G \
  -device vfio-pci,host=01:00.0,multifunction=on \
  -drive file=vm.img,format=qcow2

IOMMU Groups

  • Устройства в одной группе нельзя разделить между VM и хостом без потери изоляции.
  • Если GPU и его аудио-контроллер в разных группах → проброс только GPU возможен.
  • Проверка: lspci -vvv | grep -i "IOMMU group"

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

Вектор атаки Как IOMMU защищает
Rogue PCIe device Блокирует доступ к памяти за пределами выделенного региона
Thunderbolt/FireWire DMA Ограничивает DMA только разрешёнными IOVA
Malicious VM passthrough Interrupt remapping + DMA isolation предотвращают escape
Kernel exploitation via DMA CONFIG_IOMMU_DEFAULT_DMA_STRICT=y (включён в большинстве дистрибутивов 2024+)

Современные ОС включают IOMMU по умолчанию. В Windows это называется Kernel DMA Protection, в Linux — IOMMU strict mode.


8. Производительность и накладные расходы

Сценарий Overhead Оптимизация
Обычный хост (без VM) 0–2% iommu=pt
VFIO passthrough 0–3% Huge pages, ATS, MSI-X
Эмуляция без IOMMU 15–40% Не рекомендуется
IOTLB miss +1–5 мкс на операцию iommu.strict=0, prefetch

Совет:

Для GPU/NIC используйте iommu=pt + vfio-pci + QEMU memory-backend-file с hugetlbfs. Это даёт почти bare-metal производительность.


9. Типичные проблемы и решения

Проблема Причина Решение
IOMMU group contains multiple devices Чипсет не поддерживает ACS или BIOS отключён pcie_acs_override=downstream (только если доверяете устройствам) или замена платы
DMA Fault in dmesg Неверный IOVA, driver bug, alignment Проверить драйвер, включить CONFIG_DEBUG_DMA_API, обновить firmware
VFIO bind failed Конфликт с родным драйвером modprobe -r native_driver, использовать driver_override
IOMMU not detected BIOS disabled, старое ядро, отсутствие поддержки Проверить dmesg, обновить BIOS/ядро, убедиться в VT-d/AMD-Vi
Performance drop after enabling IOMMU Strict mode, no pt, frequent IOTLB flushes iommu=pt iommu.strict=0, huge pages, ATS

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


10. Полезные команды и скрипты

# Проверка поддержки IOMMU
[ -d /sys/kernel/iommu_groups ] && echo "IOMMU active" || echo "IOMMU inactive"

# Список устройств по группам
for g in /sys/kernel/iommu_groups/*; do
  echo "Group $(basename $g):"
  for d in $g/devices/*; do
    echo "  $(basename $d)"
  done
done

# Автоматическая привязка GPU к vfio-pci
GPU_PCI="0000:01:00.0"
echo "vfio-pci" > /sys/bus/pci/devices/$GPU_PCI/driver_override
echo $GPU_PCI > /sys/bus/pci/drivers/vfio-pci/bind

# Проверка режима IOMMU
cat /sys/module/intel_iommu/parameters/dma_mode  # "strict", "lazy", "auto"

11. Ресурсы для углубления

Тип Ссылка/Название
Kernel Docs Documentation/iommu/ в дереве ядра
LWN.net Статьи по VFIO, IOMMU groups, DMA remapping
QEMU Docs docs/system/i386/vfio.rst
Arch Wiki PCI passthrough via OVMF
Spec Intel VT-d, AMD I/O Virtualization, ARM SMMUv3, RISC-V IOMMU

Чек-лист перед использованием IOMMU

  • [ ] VT-d / AMD-Vi включён в BIOS/UEFI
  • [ ] Above 4G Decoding включён
  • [ ] Ядро собрано с CONFIG_IOMMU_SUPPORT=y, CONFIG_VFIO_PCI=y
  • [ ] Параметры intel_iommu=on / amd_iommu=on добавлены в GRUB
  • [ ] Проверены IOMMU группы (find /sys/kernel/iommu_groups/)
  • [ ] Устройства привязаны к vfio-pci, конфликтующие драйверы выгружены
  • [ ] Для производительности: iommu=pt, iommu.strict=0, huge pages
  • [ ] Для безопасности: не используйте acs_override в production