IOMMU

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, и повышает производительность и безопасность такой эмуляции.

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

Примечания

  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
  4. Alex Markuze, Adam Morrison, Dan Tsafrir. True IOMMU Protection from DMA Attacks: When Copy is Faster than Zero Copy // Proceedings of the Twenty-First International Conference on Architectural Support for Programming Languages and Operating Systems. — New York, NY, USA: Association for Computing Machinery, 2016-03-25. С. 249–262. ISBN 978-1-4503-4091-5. doi:10.1145/2872362.2872379.

Ссылки