С чем в системах с виртуальной памятью должен работать DMA – с виртуальными или с физическими адресами? Очевидная проблема с виртуальными адресами состоит в том, что блоку DMA придется проводить преобразование виртуальных адресов в физические. Основной проблемой использования физических адресов в DMA-передаче является невозможность простого пересечения границ страницы. Если запрос на ввод-вывод пересекает границу страницы, то место в памяти, куда осуществлялась передача, может не сохранить целостность в виртуальной памяти. Следовательно, при использовании физических адресов нужно ограничивать все DMA-передачи в пределах одной страницы.
Метод, позволяющий системе инициировать DMA-передачи, пересекающие границы страниц, заключается в том, чтобы заставить DMA работать с виртуальными адресами. В такой системе блок DMA имеет небольшое количество записей отображений, предоставляющих отображение виртуальных адресов на физические для передачи. Операционная система предоставляет отображение при инициировании ввода-вывода. Благодаря этому отображению, блоку DMA не нужно беспокоиться о месте нахождения виртуальной страницы, вовлеченной в передачу.
Еще одна технология для операционной системы заключается в разбиении DMA-передачи на серии передач, каждая из которых помещается внутри отдельной физической страницы. Затем передачи выстраиваются в одну цепочку и вручаются процессору ввода-вывода или «умному» блоку DMA, который выполнит всю последовательность передач, или же операционная система может выдать отдельные запросы на передачу.
Какой бы метод ни использовался, операционная система должна организовать взаимодействие таким образом, чтобы страницы не отображались заново, пока страница еще используется в DMA-передаче.
От проблем целостности данных ввода-вывода можно избавиться с помощью одной из трех главных технологий. Во-первых, можно провести все действия по вводу-выводу через кэш-память. Тогда при операциях чтения будет гарантировано получение последнего значения, а при операциях записи будут обновлены любые данные в кэш-памяти. Проводить весь ввод-вывод через кэш-память очень дорого, и потенциально это может весьма негативно сказаться на производительности процессора, потому что данные ввода-вывода редко нужны для немедленного использования и могут заменить собой полезные данные, необходимые выполняемой программе. Во-вторых, можно заставить операционную систему выборочно забраковать данные кэш-памяти при чтении ввода-вывода или заставить выполнить отложенные операции записи при записи ввода-вывода (что часто называют сбросом кэш-памяти – cache flushing). Такой подход требует небольшой аппаратной поддержки и, возможно, он будет более эффективен, если эта функция сможет быть легко и непринужденно выполнена программным обеспечением. Поскольку этот сброс больших частей кэш-памяти нужен только при обращениях блока DMA, он будет происходить сравнительно редко. В-третьих, можно предоставить аппаратный механизм для выборочного сброса (или установки недостоверности) элементов кэш-памяти. Аппаратная установка недостоверности с целью обеспечения целостности кэш-памяти часто применяется в микропроцессорных системах, и такая же технология может быть использована для ввода-вывода.