Подробный гайд по 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. Принцип работы
- Устройство формирует DMA-запрос с IOVA (виртуальный адрес, видимый устройству).
2. Запрос проходит через IOMMU, который:
- Ищет трансляцию в таблицах (аналог page tables CPU)
- Проверяет права доступа (read/write/exec)
- Проверяет границы выделенного региона
- При успехе → запрос идёт к физической памяти. При ошибке → генерируется DMA Fault, устройство блокируется.
- Для ускорения используется 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
- Зайдите в UEFI Setup (
Del/F2при загрузке)
2. Найдите разделы:
Advanced → System Agent (SA) Configuration → Intel VT-dAMD CBS → NBIO Common Options → IOMMU ControllerPCI Subsystem Settings → Above 4G Decoding(рекомендуетсяEnabled)PCIe ACS(оставьтеDefaultилиEnabled)- Сохраните и перезагрузитесь
Отключение 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