Лекция 10. DMA (Direct Memory Access) – Прямой доступ в память
10.1Два способа организации ввода-вывода
Главным направлением решения проблем ввода-вывода является магистрально-модульный способ построения ЭВМ рис. 10.1: все устройства, составляющие компьютер, включая и микропроцессор, организуются в виде модулей, которые соединяются между собой общей магистралью. Обмен информацией по магистрали удовлетворяет требованиям некоторого общего интерфейса, установленного для магистрали данного типа. Каждый модуль подключается к магистрали посредством специальных интерфейсных схем (Иi).

Рис. 10.1. Магистрально-модульный принцип построения ЭВМ
На интерфейсные схемы модулей возлагаются следующие задачи:
- обеспечение функциональной и электрической совместимости сигналов и протоколов обмена модуля и системной магистрали; преобразование внутреннего формата данных модуля в формат данных системной магистрали и обратно; обеспечение восприятия единых команд обмена информацией и преобразование их в последовательность внутренних управляющих сигналов.
Недостатком магистрально-модульного способа организации ЭВМ является невозможность одновременного взаимодействия более двух модулей, что ставит ограничение на производительность компьютера. Поэтому этот способ, в основном, используется в ЭВМ, к характеристикам которых не предъявляется очень высоких требований, например в персональных ЭВМ
В ЭВМ используются два основных способа организации передачи данных между памятью и периферийными устройствами: программно-управляемая передача и прямой доступ к памяти (ПДП).
Программно-управляемая передача данных осуществляется при непосредственном участии и под управлением процессора (рис.10.2).
Процессорный обмен
Рис 10.2. Процессорный обмен
a) Ввод / MEMWrite: ВУ → ИПУ → CPU(accumulator) → MEM
б) Вывод / MEMRead: MEM → CPU(accumulator) → ИПУ → ВУ
Например, при пересылке блока данных из периферийного устройства в оперативную память процессор должен выполнить следующую последовательность шагов:
сформировать начальный адрес области обмена ОП; занести длину передаваемого массива данных в один из внутренних регистров, который будет играть роль счетчика; выдать команду чтения информации из УВВ; при этом на шину адреса из МП выдается адрес УВВ, на шину управления - сигнал чтения данных из УВВ, а считанные данные заносятся во внутренний регистр МП; выдать команду записи информации в ОП; при этом на шину адреса из МП выдается адрес ячейки оперативной памяти, на шину управления - сигнал записи данных в ОП, а на шину данных выставляются данные из регистра МП, в который они были помещены при чтении из УВВ; модифицировать регистр, содержащий адрес оперативной памяти; уменьшить счетчик длины массива на длину переданных данных; если переданы не все данные, то повторить шаги 3-6, в противном случае закончить обмен.Как видно, программно-управляемый обмен ведет к нерациональному использованию мощности микропроцессора, который вынужден выполнять большое количество относительно простых операций, приостанавливая работу над основной программой. При этом действия, связанные с обращением к оперативной памяти и к периферийному устройству, обычно требуют удлиненного цикла работы микропроцессора из-за их более медленной по сравнению с микропроцессором работы, что приводит к еще более существенным потерям производительности ЭВМ.
Внепроцессорный обмен
Альтернативой программно-управляемому обмену служит прямой доступ к памяти - способ быстродействующего подключения внешнего устройства, при котором оно обращается к оперативной памяти, не прерывая работы процессора [3]. Такой обмен происходит под управлением отдельного устройства - контроллера прямого доступа к памяти (КПДП).
Структура ЭВМ, имеющей в своем составе КПДП, представлена на рис. 10.3.

Рис. 10.3. Обмен данными в режиме прямого доступа к памяти
Перед началом работы контроллер ПДП необходимо инициализировать: занести начальный адрес области ОП, с которой производится обмен, и длину передаваемого массива данных. В дальнейшем по сигналу запроса прямого доступа контроллер фактически выполняет все те действия, которые обеспечивал микропроцессор при программно-управляемой передаче.

Рис. 10.3 (б). Управление взаимодействием контроллера внешнего устройства с памятью
в режиме прямого доступа осуществляет контроллер DMA
Канал контроллера DMA при этом обеспечивал выполнение следующей последовательности операций (i8237A):
- прием запроса на прямую передачу данных DREQ (DMA Request) от контроллера периферийного устройства; формирование запроса на захват шины HRQ (Hold Request); прием от процессора сигнала подтверждения HLDA (Hold Acknowledge) , разрешающего захват шины; формирование сигнала DACK (DMA Acknowledge), который сообщает контроллеру периферийного устройства о начале выполнения циклов DMA; формирование на шине адреса ячейки памяти (A15-A0), с которой будет производиться операция обмена данными (чтения или записи). Старшие разряды адреса предварительно заносятся в регистр страниц DMA (Page Reg); формирование на шине сигналов управления выполнением операции обмена (MEMR/IOW, MEMW/IOR) увеличение или уменьшение адреса ячейки памяти после выполнения операции обмена; повторение циклов DMA до тех пор, пока не будет завершена передача блока данных; снятие запросов на DMA после завершения передачи блока данных.
10.2. Распределение каналов DMA
Назначение некоторых каналов контроллера DMA задано жестко, а другие каналы оставлены «свободными» и могут использоваться картами расширения, устанавливаемыми в ISA-слоты системной платы.
При разработке IBM AT возможности контроллера были расширены путем подключения второй микросхемы i8237 А в режиме каскадирования, что позволило увеличить число каналов DMA до семи (рис. 10.4).

Рис. 10.4. Каскадирование контроллеров DMA в IBM AT
Обычно каналы DMA на системных платах АТ-совместимых компьютеров распределены следующим образом:
- канал 0 — используется для регенерации динамической памяти; канал 1 — используется параллельным портом ЕСР; канал 2 — используется контроллером дисководов гибких дисков FDC; канал 3 — используется параллельным портом ЕСР; канал 4 — используется для каскадирования; канал 5 — свободен; канал 6 — свободен; канал 7 — свободен.
ПРИМЕЧАНИЕ----------------------------------------------------------------------------------
Каналы 1 и 3 заняты параллельным портом только в том случае, если используется режим ЕСР; в противном случае каналы свободны.
Микросхема i8237A содержит четыре независимых друг от друга канала DMA. Для каждого из этих каналов микросхема имеет четыре 16-разрядных регистра:
- CAR (Current Address Register) — регистр текущего адреса; CWR (Current Word Register) — регистр счетчика подлежащих передаче слов; BAR (Base Address Register) — регистр базового адреса; BWCR (Base Word Count Register) — регистр базового числа циклов DMA.
ВНИМАНИЕ__________________________________________________________________
Единица информации, передаваемая за один цикл DMA, в документации по микросхеме i8237А именуется «словом». Конкретный размер этой единицы определяется способом подключения контроллера и равен одному байту для DMA-1 и 16-разрядному слову для
DMA-2 (см. Рис. 10.5).
С точки зрения программиста, регистры CAR и CWR доступны только для считывания, а регистры BAR и BCWR — только для записи.
При обращении к контроллеру DMA выбор канала и его регистра определяется значением на четырех адресных входах микросхемы i8237А (А3 – 0). Соответствие номера порта тому или иному регистру задается следующим правилом:
A3A2A1A0 | Регистр в цикле записи | Регистр в цикле чтения |
0 Х Х 0 | BAR (Base Address Register) | CAR (Current Address Register) |
0 Х Х 1 | BWCR (Base Word Count Register) | CWR (Current Word Register) |
При этом, значение ХХ адресных разрядов А2А1 задает номер канала контроллера :
00 – канал 0, 01 – канал 1, 10 – канал 2 и 11 – канал 3.
A3A2A1A0 | WR | RD | |||
0 0 0 0 | DMA | CH0 | BAR0 | CAR0 | Регистры адреса |
0 0 1 0 | DMA +2 | CH1 | BAR1 | CAR1 | |
0 1 0 0 | DMA +4 | CH2 | BAR2 | CAR2 | |
0 1 1 0 | DMA +6 | CH3 | BAR3 | CAR3 | |
0 0 0 1 | DMA +1 | CH0 | BWCR0 | CWR0 | Регистры счетчиков |
0 0 1 1 | DMA +3 | CH1 | BWCR1 | CWR1 | циклов |
0 1 0 1 | DMA +5 | CH2 | BWCR2 | CWR2 | |
0 1 1 1 | DMA +7 | CH3 | BWCR3 | CWR3 | |
1 0 0 0 | DMA +8 | CR/SR | CR | SR | Command REG/Status REG |
1 0 0 1 | DMA +9 | RR | - | Request Register | |
1 0 1 0 | DMA +A | MSR | - | Mask Register | |
1 0 1 1 | DMA +B | MR | - | Mode Register | |
1 1 0 0 | DMA +C | F/L | - | First/Last flip-flop | |
1 1 0 1 | DMA +D | MC | - | Master Clear DMA | |
1 1 1 0 | DMA +E | CM | - | Clear MASK Register | |
1 1 1 1 | DMA +F | WAMR | - | Write All Mask Register |
Микросхема DMA-2 подключена на шину адреса со сдвигом на один разряд влево:

Рис. 10.5 Подключение DMA-1 и DMA-2 к адресной шине
Таким образом, все адресное пространство микросхемы «сдвинулось» влево на один разряд. Адреса всех регистров DMA-2 - четные. Адреса, устанавливаемые DMA-2 на системной шине − четные. Это позволяет поддерживать обмен словами.
DMA-1 поддерживает доступ к непересекаемым блокам по 64Кбайт.
DMA-2 поддерживает доступ к непересекаемым блокам по 128Кбайт.
Общий объем памяти, поддерживаемый DMA − 16 Mбайт.

Рис. 10.6. Разделение адресного пространства оперативной памяти на блоки, адресуемые контроллерами DMA-1 и DMA-2
10.3. Назначение и форматы регистров контроллера DMA

Рис. 10.7. Структурная схема СDMA
Регистр режима работы (Mode Register) − задает параметры режима работы канала.
| OUT Mode Register Порт 0Bh(D6h) Номер канала (CHANNEL): 00 — канал 0, 01 — канал 1, 10 — канал 2,11 — канал 3 Тип цикла DMA (CICLE DMA): 00— верификация, 01— запись DMA, — чтение DMA, — запрещенный кодАвтоинициализация (AUTOINIT): 0 — запрещена, 1 — разрешена Приращение адреса (DECR/INCR Addr): — инкрементирование, — декрементированиеРежим обслуживания (REGIME): 00— передача по требованию (DTM – Demand Transfer Mode), 01— одиночная передача (STM – Single Transfer Mode), — блочная передача (BTM – Block Transfer Mode), — каскадирование (Cascade Mode) |
Рис. 10.7. Формат байта режима работы канала
Регистр запроса DMA (Request Register, RR) − позволяет программно устанавливать/сбрасывать запросы DMA.
| OUT Request Register Порт 09h ( D2h ) Номер канала: 00 — канал 0, 01 — канал 1, 10 — канал 2, 11 — канал 3 Запрос на DMA: 0 — сбросить, 1 — установить Не используются (должны иметь значение 0). |
Рис. 10.8. Формат регистра программного запроса DMA
Регистр маскирования (Mask Register) − для установки / сброса триггеров маскирования отдельных каналов DMA. (Замаскированный канал игнорирует запросы DREQ от подсоединенного к нему внешнего устройства).
| OUT Mask Register Порт 0Ah ( D4h ) Номер канала: 00 — канал 0, 01 — канал 1 10 — канал 2,11 — канал 3 Маскирование DREQ: — сбросить маску, — установить маскуНе используются |
Рис. 10.10. Формат регистра маскирования канала DMA
Общие регистры
Управляющий регистр (Command Register) задает параметры работы контроллера DMA, общие для всех четырех каналов микросхемы.
| Command Register Порт 08h ( D0h )- запись (OUT) Передачи «память – память»: 0 — Запрещены, 1 — Разрешены (CH0 ->CH1: SRC CAR0 / DST CAR1,WCR1) Фиксация адреса канала 0 в режиме «память-память» 0 — запрещена, 1 — разрешена (фиксирование CAR0) Управление работой контроллера: 0 — работа разрешена(ENEBLE DMA), Сжатие цикла обмена по времени: 0 — полный цикл (s2,s3,s4) 1 — сжатый цикл (s2,s4) Порядок приоритетов: 0 — фиксированный (канал 0-1-2-3), Цикл записи: 0 — нормальный, 1 — удлиненный (х – при сжатом цикле) Уровень сигнала запроса DREQ: Уровень сигнала подтверждения DАСK:' О — низкий, 1 — высокий |
Рис 10.10. Формат управляющего регистра
Регистр состояния (Status Register) позволяет определить текущее состояние всех четырех каналов микросхемы контроллера DMA.
| Status Register Порт 08h ( D0h )- чтение (IN) Завершение счета в канале 0 (1 – Да/0 – Нет) Завершение счета в канале 1 (1 – Да/0 – Нет) Завершение счета в канале 2 (1 – Да/0 – Нет) Завершение счета в канале 3 (1 – Да/0 – Нет) Запрос DMA в канале 0 Запрос DMA в канале 1 Запрос DMA в канале 2 Запрос DMA в канале 3 |
Рис. 10.11. Формат регистра состояния
Регистр одновременной записи масок каналов (Write All Mask Register), позволяет одновременно изменить значения масок всех каналов.
| WAMR Порт 0Fh ( DEh )- запись Маскирование канала 0/4: 0 — размаскировать, 1 — замаскировать Маскирование канала 1/5: 0 — размаскировать, 1 — замаскировать Маскирование канала 2/6: 0 — размаскировать, 1 — замаскировать Маскирование канала 3/7: 0 — размаскировать, 1 — замаскировать Зарезервированы |
Рис. 10.12. Формат регистра одновременной записи / сброса масок
Программные команды (Software Command).
Сброс триггера байтов (First/Last flip-flop ) записью любого значения в порт 0Сh (D8h).
Сброс контроллера DMA-1 (DMA-2) записью любого значения в порт 0Dh (DAh).
(При этом сбрасываются регистры CR, SR, RR, TR) и устанавливаются маски всех каналов.
Сброс регистра масок контроллера DMA-1(DMA-2) записью любого значения в порт 0Eh (DCh).
Порядок инициализации канала DMA
Если в программе, работающей непосредственно с контроллером периферийного устройства, при обмене данными используется режим DMA, необходимо произвести настройку параметров канала, к которому подключено устройство, то есть инициализировать канал.
При инициализации канала DMA операции нужно выполнять в следующем порядке:
- запретить работу канала путем записи соответствующего значения в регистр маски (то есть в порт 0Ah для DMA-1 или в порт D4h для DMA-2); сбросить триггер байтов (First/Last flip-flop) посредством записи произвольного значения в соответствующий порт (0Сh для DMA-1 или D8h для DMA-2); задать режим работы канала путем записи соответствующей информации в регистр MR (то есть в порт 0Bh для DMA-1 или в порт D6h для DMA-2); побайтно (младший – старший) загрузить младшие 16 разрядов 24-битового адреса области оперативной памяти, которая будет использоваться при передаче данных, в регистр базового адреса инициализируемого канала; загрузить номер страницы памяти (старшие 8 разрядов 24-битового адреса используемой области оперативной памяти) в регистр страницы инициализируемого канала; загрузить в регистр базового числа циклов CWR инициализируемого канала значение, которое на единицу меньше количества циклов DMA, необходимого для передачи блока данных; разрешить работу канала (размаскировать канал) путем записи соответствующего значения в регистр маски (в порт 0Ah для DMA-1 или в порт D4h для DMA-2).
Инициализированный канал будет ожидать поступления запроса на прямую передачу данных от контроллера периферийного устройства.








