Прямой доступ к памяти ( DMA ) — это функция компьютерных систем, которая позволяет определенным аппаратным подсистемам получать доступ к основной системной памяти независимо от центрального процессора (ЦП). [1]
Без DMA, когда ЦП использует запрограммированный ввод/вывод , он обычно полностью занят в течение всей продолжительности операции чтения или записи и, таким образом, недоступен для выполнения другой работы. С DMA ЦП сначала инициирует передачу, затем выполняет другие операции во время передачи и, наконец, получает прерывание от контроллера DMA (DMAC), когда операция завершена. Эта функция полезна в любое время, когда ЦП не может справиться со скоростью передачи данных или когда ЦП необходимо выполнить работу, ожидая относительно медленной передачи данных ввода/вывода. Многие аппаратные системы используют DMA, включая контроллеры дисководов , графические карты , сетевые карты и звуковые карты . DMA также используется для внутричиповой передачи данных в некоторых многоядерных процессорах . Компьютеры, имеющие каналы DMA, могут передавать данные на устройства и с них с гораздо меньшими накладными расходами ЦП, чем компьютеры без каналов DMA. Аналогично, схема обработки внутри многоядерного процессора может передавать данные в локальную память и из нее, не занимая процессорного времени, что позволяет вычислениям и передаче данных происходить параллельно.
DMA также может использоваться для копирования «из памяти в память» или перемещения данных в памяти. DMA может разгрузить дорогостоящие операции с памятью, такие как большие копии или операции «рассеивание-сбор» , от ЦП к выделенному механизму DMA. Примером реализации является технология ускорения ввода-вывода . DMA представляет интерес для архитектур сетевых вычислений на кристалле и вычислений в памяти .
Стандартный DMA, также называемый сторонним DMA, использует контроллер DMA. Контроллер DMA может генерировать адреса памяти и инициировать циклы чтения или записи памяти. Он содержит несколько аппаратных регистров , которые могут быть записаны и прочитаны ЦП. К ним относятся регистр адреса памяти, регистр подсчета байтов и один или несколько регистров управления. В зависимости от того, какие функции предоставляет контроллер DMA, эти регистры управления могут указывать некоторую комбинацию источника, назначения, направления передачи (чтение с устройства ввода-вывода или запись на устройство ввода-вывода), размера блока передачи и/или количества байтов для передачи за один пакет. [2]
Для выполнения операции ввода, вывода или памяти в память хост-процессор инициализирует контроллер DMA с подсчетом количества слов для передачи и адреса памяти для использования. Затем ЦП командует периферийному устройству инициировать передачу данных. Затем контроллер DMA предоставляет адреса и линии управления чтением/записью в системную память. Каждый раз, когда байт данных готов к передаче между периферийным устройством и памятью, контроллер DMA увеличивает свой внутренний адресный регистр до тех пор, пока не будет передан полный блок данных.
Некоторые примеры шин, использующих сторонний DMA, — это PATA , USB (до USB4 ) и SATA ; однако их хост-контроллеры используют управление шиной . [ необходима ссылка ]
В системе управления шиной , также известной как система прямого доступа к памяти первой стороны, ЦП и периферийным устройствам может быть предоставлен контроль над шиной памяти. Когда периферийное устройство может стать мастером шины, оно может напрямую записывать данные в системную память без участия ЦП, предоставляя адрес памяти и сигналы управления по мере необходимости. Необходимо предусмотреть некоторые меры для перевода процессора в состояние удержания, чтобы не возникало конфликта на шине.
В пакетном режиме весь блок данных передается в одной непрерывной последовательности. После того, как контроллер DMA получает доступ к системной шине от ЦП, он передает все байты данных в блоке данных, прежде чем вернуть управление системными шинами ЦП, но делает ЦП неактивным на относительно длительные периоды времени. Этот режим также называется «Режимом передачи блоков».
Режим захвата цикла используется в системах, в которых ЦП не должен быть отключен на время, необходимое для режимов пакетной передачи. В режиме захвата цикла контроллер DMA получает доступ к системной шине так же, как и в пакетном режиме, используя сигналы BR ( Bus Request ) и BG ( Bus Grant ) , которые являются двумя сигналами, управляющими интерфейсом между ЦП и контроллером DMA. Однако в режиме захвата цикла после передачи одного блока данных управление системной шиной отменяется для ЦП через BG. Затем он постоянно запрашивается снова через BR, передавая один блок данных за запрос, пока не будет передан весь блок данных. [3] Постоянно получая и освобождая управление системной шиной, контроллер DMA по сути чередует инструкции и передачи данных. ЦП обрабатывает инструкцию, затем контроллер DMA передает одно значение данных и так далее. Данные не передаются так быстро, но ЦП не простаивает так долго, как в пакетном режиме. Режим захвата цикла полезен для контроллеров, которые отслеживают данные в реальном времени.
Прозрачный режим занимает больше всего времени для передачи блока данных, но при этом является наиболее эффективным режимом с точки зрения общей производительности системы. В прозрачном режиме контроллер DMA передает данные только тогда, когда ЦП выполняет операции, не использующие системные шины. Основное преимущество прозрачного режима заключается в том, что ЦП никогда не прекращает выполнение своих программ, а передача DMA бесплатна с точки зрения времени, в то время как недостатком является то, что оборудованию необходимо определять, когда ЦП не использует системные шины, что может быть сложным. Это также называется « скрытым режимом передачи данных DMA ».
DMA может привести к проблемам с когерентностью кэша . Представьте себе ЦП, оснащенный кэшем и внешней памятью, к которой могут обращаться напрямую устройства, использующие DMA. Когда ЦП обращается к ячейке X в памяти, текущее значение будет сохранено в кэше. Последующие операции с X обновят кэшированную копию X, но не версию X во внешней памяти, предполагая кэш обратной записи . Если кэш не будет сброшен в память до того, как устройство в следующий раз попытается получить доступ к X, устройство получит устаревшее значение X.
Аналогично, если кэшированная копия X не становится недействительной, когда устройство записывает новое значение в память, то ЦП будет работать с устаревшим значением X.
Эту проблему можно решить одним из двух способов проектирования системы: Системы с когерентным кэшем реализуют метод на аппаратном уровне, называемый bus snooping , посредством которого внешние записи передаются контроллеру кэша, который затем выполняет аннулирование кэша для записей DMA или очистку кэша для чтений DMA. Некогерентные системы оставляют это программному обеспечению, где ОС должна затем гарантировать, что строки кэша очищены до начала исходящей передачи DMA и аннулированы до доступа к диапазону памяти, затронутому входящей передачей DMA. ОС должна гарантировать, что к диапазону памяти не обращаются никакие работающие потоки в это время. Последний подход вносит некоторые накладные расходы в операцию DMA, так как большинству оборудования требуется цикл для аннулирования каждой строки кэша по отдельности.
Существуют также гибриды, в которых вторичный кэш L2 является когерентным, а кэш L1 (обычно на ЦП) управляется программным обеспечением.
В оригинальном IBM PC (и последующем PC/XT ) был только один контроллер DMA Intel 8237, способный обеспечить четыре канала DMA (пронумерованных от 0 до 3). Эти каналы DMA выполняли 8-битные передачи (поскольку 8237 был 8-битным устройством, идеально соответствующим архитектуре процессора/шины i8088 ПК ), могли адресовать только первый ( стандартный i8086 /8088) мегабайт ОЗУ и были ограничены адресацией отдельных сегментов по 64 КБ в этом пространстве (хотя исходные и целевые каналы могли адресовать разные сегменты). Кроме того, контроллер можно было использовать только для передач на, с или между устройствами ввода-вывода шины расширения, поскольку 8237 мог выполнять передачи из памяти в память только с использованием каналов 0 и 1, из которых канал 0 в ПК (& XT) был выделен для динамического обновления памяти . Это не позволяло использовать его в качестве универсального « блиттера », и, как следствие, перемещение блоков памяти в ПК, ограниченное общей скоростью PIO процессора, было очень медленным.
С IBM PC/AT улучшенная шина AT (более известная как Industry Standard Architecture (ISA)) добавила второй контроллер DMA 8237 для предоставления трех дополнительных, и как подчеркивают конфликты ресурсов с дополнительной расширяемостью XT по сравнению с исходным PC, крайне необходимых каналов (5–7; канал 4 используется как каскад к первому 8237). Регистр страницы также был перемонтирован для адресации полного адресного пространства памяти 16 МБ процессора 80286. Этот второй контроллер также был интегрирован таким образом, чтобы иметь возможность выполнять 16-битные передачи, когда устройство ввода-вывода используется в качестве источника данных и/или назначения (поскольку он фактически обрабатывает только сами данные для передач из памяти в память, в противном случае просто управляя потоком данных между другими частями 16-битной системы, делая собственную ширину шины данных относительно несущественной), удваивая пропускную способность данных при использовании верхних трех каналов. Для совместимости нижние четыре канала DMA по-прежнему были ограничены только 8-битными передачами, и хотя передачи из памяти в память теперь были технически возможны из-за освобождения канала 0 от необходимости обрабатывать обновление DRAM, с практической точки зрения они имели ограниченную ценность из-за последующей низкой пропускной способности контроллера по сравнению с тем, чего теперь мог достичь ЦП (т. е. 16-битный, более оптимизированный 80286 , работающий на минимальной частоте 6 МГц, по сравнению с 8-битным контроллером, заблокированным на частоте 4,77 МГц). В обоих случаях оставалась проблема границы сегмента 64 КБ , при этом отдельные передачи не могли пересекать сегменты (вместо этого «переходя» к началу того же сегмента) даже в 16-битном режиме, хотя на практике это было больше проблемой сложности программирования, чем производительности, поскольку постоянная необходимость обновления DRAM (как бы оно ни обрабатывалось) для монополизации шины примерно каждые 15 мкс не позволяла использовать большие (и быстрые, но непрерываемые) передачи блоков.
Из-за их отстающей производительности ( максимальная скорость передачи 8-битных данных составляет 1,6 МБ /с при частоте 5 МГц [4], но не более 0,9 МБ/с в PC/XT и 1,6 МБ/с для 16-битных данных в AT из-за накладных расходов шины ISA и других помех, таких как прерывания обновления памяти [1] ), а также из-за отсутствия каких-либо скоростных классов, которые позволили бы установить прямые замены, работающие на скоростях выше стандартной тактовой частоты оригинального ПК 4,77 МГц, эти устройства фактически устарели с конца 1980-х годов. В частности, появление процессора 80386 в 1985 году и его способность к 32-битным передачам (хотя значительные улучшения в эффективности вычисления адресов и перемещениях блочной памяти в процессорах Intel после 80186 означали, что передачи PIO даже 16-битной шиной 286 и 386SX все еще могли легко превзойти 8237), а также разработка дальнейших эволюций ( EISA ) или замен ( MCA , VLB и PCI ) шины "ISA" с их собственными гораздо более высокопроизводительными подсистемами DMA (максимум до 33 МБ/с для EISA, 40 МБ/с MCA, обычно 133 МБ/с VLB/PCI) сделали оригинальные контроллеры DMA похожими скорее на жернова производительности, чем на усилитель. Они поддерживались в той степени, в которой они требовались для поддержки встроенного устаревшего оборудования ПК на более поздних машинах. Устаревшее оборудование, которое продолжало использовать ISA DMA после того, как 32-битные шины расширения стали обычным явлением, включало карты Sound Blaster , которым требовалось поддерживать полную аппаратную совместимость со стандартом Sound Blaster; и устройства Super I/O на материнских платах, которые часто интегрировали встроенный контроллер гибких дисков , инфракрасный контроллер IrDA при выборе режима FIR (быстрый инфракрасный) и контроллер параллельного порта IEEE 1284 при выборе режима ECP. В случаях, когда все еще использовались оригинальные 8237 или напрямую совместимые, передача данных на эти устройства или с них все еще могла быть ограничена первыми 16 МБ основной оперативной памяти независимо от фактического адресного пространства системы или объема установленной памяти.
Каждый канал DMA имеет 16-битный регистр адреса и 16-битный регистр счетчика, связанный с ним. Чтобы инициировать передачу данных, драйвер устройства устанавливает адрес канала DMA и регистры счетчика вместе с направлением передачи данных, чтение или запись. Затем он дает команду оборудованию DMA начать передачу. Когда передача завершена, устройство прерывает работу ЦП.
Scatter-gather или векторный ввод-вывод DMA позволяет передавать данные в несколько областей памяти и из них в одной транзакции DMA. Это эквивалентно объединению в цепочку нескольких простых запросов DMA. Мотивация заключается в том, чтобы разгрузить ЦП от нескольких прерываний ввода-вывода и задач копирования данных.
DRQ означает запрос данных ; DACK означает подтверждение данных . Эти символы, которые можно увидеть на схемах оборудования компьютерных систем с функциональностью DMA, представляют собой электронные сигнальные линии между ЦП и контроллером DMA. Каждый канал DMA имеет одну линию запроса и одну линию подтверждения. Устройство, использующее DMA, должно быть настроено на использование обеих линий назначенного канала DMA.
16-битный ISA допускал управление шиной. [5]
Стандартные задания ISA DMA:
Архитектура PCI не имеет центрального контроллера DMA, в отличие от ISA. Вместо этого устройство PCI может запросить управление шиной («стать мастером шины ») и запросить чтение и запись в системную память. Точнее, компонент PCI запрашивает владение шиной у контроллера шины PCI (обычно хост-моста PCI и моста PCI-PCI [6] ), который будет решать , если несколько устройств одновременно запросят владение шиной, поскольку в один момент времени может быть только один мастер шины. Когда компоненту предоставлено владение, он будет выдавать обычные команды чтения и записи на шине PCI, которые будут затребованы контроллером шины PCI.
Например, на ПК на базе Intel Core южный мост будет пересылать транзакции на контроллер памяти (который интегрирован в кристалл ЦП) с помощью DMI , который, в свою очередь, преобразует их в операции DDR и отправляет их на шину памяти. В результате, в передаче PCI DMA задействовано довольно много шагов; однако это не представляет большой проблемы, поскольку само устройство PCI или шина PCI на порядок медленнее остальных компонентов (см. список пропускных способностей устройств ).
Современный процессор x86 может использовать более 4 ГБ памяти, используя либо собственный 64-битный режим процессора x86-64 , либо Physical Address Extension (PAE), 36-битный режим адресации. В таком случае устройство, использующее DMA с 32-битной адресной шиной, не может адресовать память выше линии 4 ГБ. Новый механизм Double Address Cycle (DAC), если он реализован как на шине PCI, так и на самом устройстве, [7] обеспечивает 64-битную адресацию DMA. В противном случае операционной системе придется обойти эту проблему, либо используя дорогостоящие двойные буферы (номенклатура DOS/Windows), также известные как буферы отскока ( FreeBSD /Linux), либо она может использовать IOMMU для предоставления услуг трансляции адресов, если таковой имеется.
В качестве примера движка DMA, встроенного в универсальный ЦП, некоторые чипсеты Intel Xeon включают движок DMA, называемый технологией ускорения ввода-вывода (I/OAT), который может разгрузить копирование памяти от основного ЦП, освободив его для выполнения другой работы. [8] В 2006 году разработчик ядра Linux от Intel Эндрю Гровер провел тесты с использованием I/OAT для разгрузки копирования сетевого трафика и обнаружил не более 10% улучшения в использовании ЦП при получении рабочих нагрузок. [9]
Дальнейшие ориентированные на производительность усовершенствования механизма DMA были введены в процессорах Intel Xeon E5 с их функцией Data Direct I/O ( DDIO ), позволяющей «окнам» DMA находиться в кэшах ЦП вместо системной оперативной памяти. В результате кэши ЦП используются в качестве основного источника и назначения для ввода-вывода, позволяя контроллерам сетевых интерфейсов (NIC) выполнять DMA непосредственно в кэше последнего уровня (кэш L3) локальных ЦП и избегать дорогостоящего извлечения данных ввода-вывода из системной оперативной памяти. В результате DDIO снижает общую задержку обработки ввода-вывода, позволяет выполнять обработку ввода-вывода полностью в кэше, предотвращает превращение доступной полосы пропускания/задержки ОЗУ в узкое место производительности и может снизить энергопотребление, позволяя ОЗУ дольше оставаться в состоянии низкого энергопотребления. [10] [11] [12] [13]
В системах на кристалле и встроенных системах типичная инфраструктура системной шины представляет собой сложную встроенную шину, такую как AMBA High-performance Bus . AMBA определяет два вида компонентов AHB: главный и подчиненный. Подчиненный интерфейс похож на программируемый ввод-вывод, через который программное обеспечение (работающее на встроенном ЦП, например, ARM ) может записывать/считывать регистры ввода-вывода или (реже) локальные блоки памяти внутри устройства. Главный интерфейс может использоваться устройством для выполнения транзакций DMA в/из системной памяти без значительной загрузки ЦП.
Поэтому устройства с высокой пропускной способностью, такие как сетевые контроллеры, которым необходимо передавать огромные объемы данных в/из системной памяти, будут иметь два интерфейсных адаптера для AHB: главный и подчиненный интерфейс. Это связано с тем, что встроенные шины, такие как AHB, не поддерживают трехстабильность шины или чередование направления любой линии на шине. Как и PCI, центральный контроллер DMA не требуется, поскольку DMA является шинным мастером, но требуется арбитр в случае наличия в системе нескольких мастеров.
Внутри устройства обычно присутствует многоканальный механизм прямого доступа к памяти (DMA), который выполняет несколько одновременных операций сбора-рассеивания в соответствии с программой.
В качестве примера использования DMA в многопроцессорной системе на кристалле , процессор Cell от IBM/Sony/Toshiba включает в себя движок DMA для каждого из своих 9 процессорных элементов, включая один процессорный элемент Power (PPE) и восемь синергетических процессорных элементов (SPE). Поскольку инструкции загрузки/хранения SPE могут считывать/записывать только свою собственную локальную память, SPE полностью зависит от DMA для передачи данных в основную память и локальные памяти других SPE и из них. Таким образом, DMA выступает в качестве основного средства передачи данных между ядрами внутри этого ЦП (в отличие от когерентных кэш-архитектур CMP, таких как отмененный Intel GPU общего назначения Larrabee ).
DMA в Cell полностью когерентен в кэше (обратите внимание, что локальные хранилища SPE, с которыми работает DMA, не действуют как глобально когерентный кэш в стандартном смысле ). Как при чтении («get»), так и при записи («put») команда DMA может передавать либо область одного блока размером до 16 КБ, либо список из 2–2048 таких блоков. Команда DMA выдается путем указания пары локального адреса и удаленного адреса: например, когда программа SPE выдает команду put DMA, она указывает адрес своей собственной локальной памяти в качестве источника и адрес виртуальной памяти (указывающий либо на основную память, либо на локальную память другого SPE) в качестве цели вместе с размером блока. Согласно эксперименту, эффективная пиковая производительность DMA в Cell (3 ГГц при равномерном трафике) достигает 200 ГБ в секунду. [14]
Процессоры с памятью scratchpad и DMA (например, цифровые сигнальные процессоры и процессор Cell ) могут выиграть от программного перекрытия операций памяти DMA с обработкой посредством двойной буферизации или мультибуферизации. Например, память на кристалле разделена на два буфера; процессор может работать с данными в одном, в то время как механизм DMA загружает и сохраняет данные в другом. Это позволяет системе избегать задержек памяти и использовать пакетные передачи за счет необходимости предсказуемого шаблона доступа к памяти . [ необходима цитата ]