Прямой доступ к памяти DMA – метод обмена данными периферийного устройства с памятью без участия процессора.
IBM PC XT и XT-совместимые ПЭВМ имеют один 4-канальный контроллер DMA 8237А. Назначение каналов следующее:
0 - обмен память-память; 1 - свободен (может использоваться сетевыми адаптерами); 2 - обмен с контроллером гибких дисков; 3 - обмен с контроллером жестких дисков.
Все 4 канала выполняют побайтовую передачу данных с 8-разрядными портами обслуживаемых устройств (максимальный размер блока64 Кбайт). IBM PC AT и AT-подобные ПЭВМ имеют два контроллера DMA 8237А, работающие в каскадном режиме (см. рис. 1).
Для сохранения преемственности с ХТ-компьютерами каналы 1-й микросхемы номеруются 0-3, а каналы 2-ой микросхемы номеруются как 4-7 и предназначены для обмена данными с 16-разрядными портами обслуживающих устройств (максимальный размер блока 128 Кбайт при обмене 16-разрядными словами только по четной границе адреса).
Назначение каналов следующие:
0 - свободен; 1 - адаптер SDLC; 2 - контроллер накопителей на гибких дисках; 3 - контроллер накопителей на жестких дисках; 4 - каскад с первым контроллером DMA; 5, 6, 7 - свободны.
Так как цепочечные команды микропроцессоров 80286 и выше более быстродействующие, то они используются при обмене данных с жесткими дисками и канал 3 первой микросхемы освободился.
Управление каналами 0 - 3 осуществляется аналогично PC/ХТ. Каналы 4 - 7 предназначены для обмена 16-разрядными словами. В связи с этим возникает ряд отличий в работе с этими каналами:
- бит 0 в данных, заносимых в регистры начального и текущего адреса, всегда подразумевается равным 0, поэтому через эти регистры передаются биты 1 - 16 полного 23-разрядного адреса (а не биты 0 - 15 полного 20-разрядного адреса, как это реализовано на ХТ-подобных ПЭВМ), по этой же причине в страничные регистры каналов 4 - 7 заносятся биты 17 - 23 полного адреса, а не биты 16 - 23, как это надо сделать при работе с каналами 0 - 3;
- поскольку передача осуществляется 16-разрядными словами, в регистры текущего и начального счетчика циклов заносится не число байт, а число слов, уменьшенное на единицу;
- размеры страниц памяти, в пределах которых возможен обмен в течение одной передачи составляют 20000h байтов.
Программное управление контроллером DMA осуществляется через порты ввода-вывода. Доступ к каждому регистру контроллера может быть осуществлен через свои порты ввода-вывода.
Порты 0h-7h для DMA1 (C0h-CEh для DMA2; далее будут указываться порты DMA1) предназначены для записи исходных значений в регистры начального и текущего адреса, начального и текущего счетчика циклов для всех 4-х каналов. Так как порты восьмиразрядные, а регистры, в которые через них заносятся данные, 16-разрядные, то запись производится в два приема. Перед первой командой вывода в требуемый порт необходимо сбросить триггер-защелку, для чего выполняется команда вывода произвольного значения в порт Ch, после чего в требуемый порт выводится младший байт 16-разрядного значения и затем старший байт следующей команды вывода в тот же порт. Запись в порт 8h инициализирует команду DMA.
Запись в порт Bh устанавливает значение в регистре режимов одного из 4-х каналов DMA. Биты 0 и 1 задают номер канала (00 - 0, 01 - 1, 10 - 2, 11 - 3). В биты 2 - 7 заносятся значения, передаваемые соответственно в биты 0 - 6 регистра режимов.
Запись в порт Dh задает программный сброс контроллера (Master Clear). Вывод любого байта в этот порт имеет тот же эффект, что и аппаратный сброс контроллера. При программном сбросе очищаются регистры команд, состояния, запросов и рабочий регистр. Так же сбрасывается триггер-защелка и устанавливается все
биты масок в регистре масок. После программного сброса контроллер переходит в цикл ожидания.
Вывод любого байта в порт Eh очищает регистр масок - сбрасывает биты масок всех 4-х каналов DMA и таким образом разрешает прием запросов на DMA по всем каналам.
Через порт Fh можно задать произвольное значение регистра масок DMA. Для этого необходимо в битах 0 - 3 передаваемого байта установить требуемое значение масок каналов 0 - 3 соответственно и вывести это значение в порт.
Страничные регистры DMA предназначены для задания номера страницы памяти, с которой будет производится обмен. Под номером страницы понимаются старшие 4 бита полного 20-битового адреса ОЗУ, т.е. начальные сегментные адреса страниц будут кратны 10000h (0, 10000h, 20000h, ..., 90000h). Напомним, что архитектура DMA позволяет работать только со страницей памяти размером 64 К, а логика, обеспечивающая переключение страниц устроена так, что страницы имеют жесткие границы. Из-за этой особенности невозможно с помощью DMA осуществить обмен с блоками памяти, пересекающими границу между двумя такими страницами.