IOMMU (англ. input/output memory management unit) — блок управления памятью (MMU) для операций ввода-вывода. Так же как традиционный, процессорный блок управления памятью, который переводит виртуальные адреса, видимые процессором в физические, этот блок занимается трансляцией виртуальных адресов, видимых аппаратным устройством, в физические адреса. Некоторые IOMMU также позволяют задавать различные ограничения операций ввода-вывода для защиты от неправильно работающих устройств или для изоляции, например, при использовании виртуализации (см. VT-d).

При наличии IOMMU у аппаратуры имеется возможность проводить DMA-операции не только по физическим адресам, но и по логическим (виртуальным). Такая возможность упрощает устройства, которым больше не нужно заботиться о поддержке DMA по разрывному (с точки зрения физических адресов) региону памяти (поддержка такого DMA в драйвере влечет за собой накладные расходы).

Недостатками использования IOMMU по сравнению с прямой физической адресацией памяти в DMA запросах являются:

  • Некоторое ухудшение производительности из-за необходимости транслирования адресов и расходов на управление, например, проход по иерархии таблицы страниц.
  • Дополнительное потребление памяти для хранения таблиц отображения. Может быть уменьшен при использовании основных таблиц трансляции адресов процессора.

IOMMU используется для прямой работы виртуализованных операционных систем с оборудованием основной системы. Наличие IOMMU для таких комбинаций позволяет повысить безопасность, производительность и упростить реализацию виртуальной машины.[1] Примеры IOMMU для виртуализации на платформах x86/x86_64: Intel VT-d и AMD-Vi.

IOMMU всегда использовался на компьютерах Sun SPARC[2] для шины SBus, также он использовался на компьютерах DEC Alpha[2] для шины PCI.

Разновидностью IOMMU является AGP GART (Graphics Address Remapping Table, таблица преобразований графических адресов[3]).

Как правило, обычные PC-совместимые компьютеры не имели IOMMU (кроме AGP GART). Вместо этого все главнейшее периферийное оборудование где-то с конца 90х годов разрабатывалось с поддержкой chain DMA.

Тем не менее, широкое распространение гипервизоров виртуальных машин привело к включению поддержки IOMMU в «гостевые» ОС, такие, как Windows (API ядра Windows всегда поддерживал данную функцию, хотя обычно данная поддержка не реализовывалась).

Наличие такой поддержки в гостевой ОС при виртуализации самого устройства IOMMU сильно облегчает задачу эмуляции в гостевой ОС сложных устройств, использующих DMA, и повышает производительность и безопасность такой эмуляции.

Примечания

править
  1. QEMU - ArchWiki. Дата обращения: 16 октября 2018. Архивировано 16 октября 2018 года.
  2. 1 2 Д Бовет. Ядро Linux, 3-е издание. ISBN 978-5-94157-957-0, глава 13, стр. 702
  3. Д Бовет. Ядро Linux, 3-е издание. ISBN 978-5-94157-957-0, глава 13, стр. 698

Ссылки

править