Обзор IOMMU
В этой главе представлен обзор возможностей IOMMU и представлены несколько моделей использования.
Модуль управления памятью ввода-вывода (IOMMU) расширяет системную архитектуру AMD64, добавляя поддержку трансляции адресов и защиту доступа к системной памяти при передаче DMA с периферийных устройств. IOMMU также помогает фильтровать и переназначать прерывания от периферийных устройств. IOMMU обеспечивает несколько значительных улучшений на уровне системы:
• Поддержка устаревших 32-битных устройств ввода-вывода в 64-битных системах (как правило, без использования буферов восстановления и дорогостоящих копий памяти).
• Более безопасный доступ приложений на уровне пользователя к выбранным устройствам ввода-вывода.
• Более безопасный доступ гостевой операционной системы виртуальной машины к выбранным устройствам ввода-вывода.
IOMMU можно использовать для:
• Заменить существующий механизм таблицы перераспределения графических адресов (GART).
• Переназначить адреса размером более 4 ГБ для устройств ввода-вывода, которые не поддерживают 64-битную адресацию.
• Разрешить гостевой ОС, работающей на виртуальной машине, иметь прямой назначенный контроль над устройством.
• Обеспечить управление степенью детализации страниц доступа устройств к системной памяти.
• Разрешить устройству прямой доступ к пользовательскому пространству ввода-вывода.
• Разрешить прямую доставку прерываний в гостевую операционную систему.
• Фильтровать и переназначать прерывания.
• Совместное использование виртуального адресного пространства процесса с выбранными периферийными устройствами.
• Изолируйте устройства или используйте «песочницу», чтобы предотвратить доступ злоумышленников по прямому доступу к памяти (DMA), чувствительным к безопасности, и пользовательским данным в памяти.
• Применяйте политики безопасности ОС для доступа к данным.
IOMMU можно рассматривать как обобщение двух средств, включенных в архитектуру AMD64: GART и вектора исключения устройств (DEV). GART обеспечивает трансляцию адресов.
Устройство ввода-вывода имеет доступ к небольшому диапазону физического адресного пространства системы, а DEV обеспечивает ограниченную степень классификации устройств ввода-вывода и защиты памяти. При соответствующей поддержке программного обеспечения IOMMU может эмулировать возможности GART или DEV. IOMMU дополнительно предоставляет возможность переназначать векторы периферийных прерываний.
Краткое описание возможностей IOMMU
IOMMU расширяет концепцию доменов защиты (или для краткости доменов), впервые представленную в AMD64 DEV. IOMMU позволяет назначить каждое устройство ввода-вывода в системе определенному домену и отдельному набору таблиц страниц ввода-вывода. Когда устройство ввода-вывода пытается прочитать или записать системную память, IOMMU перехватывает доступ, определяет домен, которому назначено устройство, и использует записи TLB, связанные с этим доменом, или таблицы страниц ввода-вывода, связанные с этим. Устройство ввода-вывода, определяющее, разрешен ли доступ, а также фактическое место в системной памяти, к которому осуществляется доступ. IOMMU может включать дополнительную поддержку удаленных IOTLB. Доверенное устройство ввода-вывода с поддержкой IOTLB может взаимодействовать с IOMMU для поддержания собственного кэша преобразований адресов. Это создает основу для создания масштабируемых систем с IOMMU, в которых устройства ввода-вывода могут иметь разные модели использования и размеры рабочих наборов. Устройства ввода-вывода с поддержкой IOTLB содержат частные TLB, адаптированные для их собственных нужд, создавая масштабируемую распределенную систему TLB. Производительность устройств ввода-вывода с поддержкой IOTLB не ограничивается количеством записей TLB, реализованных в IOMMU. Периферийное устройство с IOTLB может выдавать нетранслированные адреса или предварительно транслированные адреса, которые определяются из записей IOTLB. Предварительно транслированные адреса не проверяются IOMMU, за исключением проверки того, что на периферийном устройстве установлен бит включения IOTLB (I = 1) в соответствующей записи таблицы устройств.
Основные системные ресурсы, предоставляемые IOMMU, включают:
• Проверка разрешений на доступ к DMA ввода-вывода и преобразование адресов с использованием таблиц преобразования, хранящихся в памяти.
• Дополнительная поддержка гостевых таблиц трансляции, совместимых с форматом таблиц страниц AMD64 в длинном режиме.
• Таблица устройств, которая позволяет назначать устройства ввода-вывода определенным доменам и содержит указатели на таблицы страниц устройств ввода-вывода.
• Таблица переназначения прерываний, которую IOMMU использует для обеспечения проверки разрешений и переназначения прерываний для прерываний устройств ввода-вывода.
• Дополнительный механизм гостевого виртуального APIC AMD64, который IOMMU использует для доставки прерываний гостевым виртуальным машинам.
• Очереди в памяти для обмена командами и информацией о состоянии между IOMMU и системным процессором(ами).
• Дополнительная поддержка журнала запросов периферийных страниц (PPR).
• Функции для уменьшения переполнения PPR и журнала событий.
• Дополнительная поддержка аппаратного механизма, позволяющего привилегированным устройствам ввода-вывода напрямую обращаться к определённым областям системной памяти. IOMMU аналогичен блоку управления памятью процессора, за исключением того, что он обеспечивает преобразование адресов и защиту страниц для прямого доступа к памяти (DMA) со стороны периферийных устройств, а не для доступа к памяти со стороны процессора.
IOMMU не предоставляет прямое указание устройству ввода-вывода о неудачном переводе при обработке непереведенного отправленного запроса. Это контрастирует с механизмом ошибки страницы, используемым MMU процессора.
Системы, поддерживаемые IOMMU, могут состоять из нескольких узлов процессора и устройств, соединенных друг с другом с помощью фабрики данных, такой как AMD Infinity Fabric, каналов Data Fabric или других средств. IOMMU может обрабатывать только транзакции памяти, которые маршрутизируются через его узел в структуре системы. В системе с несколькими каналами и шинами для устройств ввода-вывода требуется несколько модулей IOMMU, чтобы гарантировать, что каждый канал или шина ввода-вывода имеет соответствующую защиту и преобразование. На рис. 1 показан пример платформы с двумя деревьями соединений ввода-вывода. Обратите внимание, что IOMMU требуется в корневом узле обоих деревьев. В этом примере IOMMU реализован как часть концентратора ввода-вывода. Возможны и другие реализации, предполагающие, что они соответствуют той же топологии.
IOMMU использует очередь команд в памяти (буфер команд) для приема явных команд аннулирования буфера трансляции, инициированных системным программным обеспечением. Опционально IOMMU может включать поддержку запросов периферийных страниц (PPR) для периферийных устройств, использующих службы трансляции адресов (ATS). Это создает механизм для периферийных устройств и программного обеспечения, позволяющий уменьшить потребность в закрепленных страницах во время ввода-вывода. IOMMU может включать дополнительную поддержку виртуализации прерываний. При этом используется виртуализированный гостевой APIC (одной из реализаций гостевого APIC является расширенный контроллер виртуальных прерываний) с таблицами памяти для доставки прерываний гостевым виртуальным машинам.