Контроллер прямого доступа к памяти.

29/02/96 13:50 dma.lek
Роберт Журден "Справочник программиста на компьютере фирмы IBM".
А.Г.Шевчик, Т.В.Демьянков "Справочник программиста и пользователя" серия "Карманная энциклопедия" М."Кварта" 1993.
Ю.М.Казаринов "Микропроцессорный комплект К1810. Структура, программирование, применение." Справочная книга. М. "Высшая школа" 1990.

Контроллер прямого доступа к памяти.

Введение.

Прямой доступ к памяти (DMA) - это метод непосредственного обращения к памяти, минуя процессор. Процессор отвечает только за программирование DMA: настройку на определенный тип передачи, задание начального адреса и размера массива обмениваемых данных. Обычно DMA используется для обмена массивами данных между системной памятью и устройствами ввода-вывода.

Обмен данными между процессором и устройствами ввода-вывода осуществляется по системной шине, "хозяином" которой является процессор. При использовании контроллера DMA на время обмена данными он должен получить управление системной шиной, т.е. стать ее "хозяином". По окончании обмена подсистема DMA возвращает процессору право управления шиной.

Архитектура компьютера PC AT включает в себя подсистему DMA, состоящую из двух контроллеров DMA Intel 8237, регистра старшего адреса DMA и регистров страниц DMA. Эти контроллеры обеспечивают 7 каналов DMA.

Система обеспечивает передачу данных по каналам DMA как по одному байту за цикл DMA, так и по два байта за цикл, исходя из возможностей архитектуры процессора (двухбайтной шины данных). Чтобы сохранить преемственность подсистемы DMA в PC AT с аналогичной подсистемой в PC XT каскадирование "байтного" контроллера DMA с распределением каналов XT осуществляется через "словный" контроллер DMA.

Общий алгоритм ПДП.

Для осуществления прямого доступа к памяти контроллер должен выполнить ряд последовательных операций:

Формирование адреса памяти.

Контроллеры DMA обеспечивают формирование только 16 младших разрядов адреса памяти. Причем старшая часть адреса (А15-А8 для DMA1 или А16-А9 для DMA2) во время цикла DMA по шине данных поступает в регистр старшего адреса DMA и далее на шину адреса, а младшая часть адреса (А7-А0 для DMA1 или А8-А1 для DMA2) выдается на шину адреса непосредственно из контроллера. Восемь старших разрядов адреса памяти содержатся в регистре страниц DMA. Разряд А16 из регистра страниц DMA запрещается, когда выбран DMA2. Разряд A0 не связан с DMA2 и всегда содержит нуль при передаче слова.

Это означает, что:

Таким образом, контроллер DMA и регистр страниц определяют 24-разрядный адрес, что обеспечивает передачу данных в пределах адресного пространства 16 М байт.

Регистры страниц.

Регистр страниц вместе с контроллерами DMA он определяет полный (24-разрядный) адрес для каналов DMA.

Адреса портов регистров страниц:

Канал DMA

Адрес порта регистра страниц

0

087h

1

083h

2

081h

3

082h

4

-

5

08Вh

6

089h

7

08Ah

Регенерация

08Fh

* Содержимое регистра страниц в целях регенерации должно быть равно 00h.

Адресация портов.

В таблице приведены адреса портов - регистров адреса ОП и управления/состояния контроллеров DMA, а также форматы регистров:

Функции регистров

Формат

Адреса портов

Чтение/запись

DMA1

DMA2

Регистр состояния (STAT)
Read Status Register)

8

008h

0D0h

Чтение

Регистр команд (CR)
(Write Command Register)

Запись

Регистр режима (MOD)
(Write Mode Register)

6

00Bh

0D6h

Запись

Регистр режима (MOD)***
(Read Mode Register)

Чтение

Запись одиночных разрядов регистра маск
(Write Single Mask Register)

4

00Ah

0D4h

Запись

Регистр команд (CR)***
(Read Command Register)

8

Чтение

Запись всех разрядов маски
(Write Mask Register)

4

00Fh

0DEh

Запись

Регистр маски (MASK)***
(Read Mask Register)

Чтение

Программный регистр запросов (REQ)**
Write Request Register)

4

009h

0D2h

Запись

Регистр запросов ***
(Read Request Register)

Чтение

Базовый и текущий регистры адреса - канал 0

16

000h

0C0h

Запись

Текущий регистр адреса канал 0

16

000h

0C0h

Чтение

Базовый и текущий регистры cчетчика - канал 0

16

001h

0C2h

Запись

Текущий регистр счетчика - канал 0

16

001h

0C2h

Чтение

Базовый и текущий регистры адреса - канал 1

16

002h

0C4h

Запись

Текущий регистр адреса - канал 1

16

002h

0C4h

Чтение

Базовый и текущий регистры cчетчика - канал 1

16

003h

0C6h

Запись

Текущий регистр счетчика - канал 1

16

003h

0C6h

Чтение

Базовый и текущий регистры адреса - канал 2

16

004h

0C8h

Запись

Текущий регистр адреса - канал 2

16

004h

0C8h

Чтение

Базовый и текущий регистры cчетчика - канал 2

16

005h

0CAh

Запись

Текущий регистр счетчика - канал 2

16

005h

0CAh

Чтение

Базовый и текущий регистры адреса - канал 3

16

006h

0CCh

Запись

Текущий регистр адреса - канал 3

16

006h

0CCh

Чтение

Базовый и текущий регистры cчетчика - канал 3

16

007h

0CEh

Запись

Текущий регистр счетчика - канал 3

16

007h

0CEh

Чтение

Временный регистр данных(TR)**
Read Temporary Register)¦

16

00Dh

0DAh

Чтение

Общий сброс
(Master Clear)

*

Запись

Сброс F/F(Clear Byte Pointer Flip-Flop)

*

00Ch

0D8h

Запись

Установка F/F ***
(Set Byte Pointer Flip-Flop)

Чтение

Сброс регистра маски
(Clear Mask Register)

*

00Eh

0DCh

Запись

Сброс счетчика MODE ***
(Clear Mode Counter)

Чтение

Режимы обслуживания.

В активном цикле обслуживание подсистемы DMA возможно в одном из четырех режимов. Окончание обслуживания распознается по переходу регистра счетчика слов из 0000Н в FFFFН. При этом возникает сигнал окончания счета (TC), который может вызвать автоинициализацию, если она запрограммирована, или маскирование канала при ее отсутствии.

Одновременно с TC вырабатывается выходной сигнал -EOP. Во время автоинициализации первоначальные значения регистров текущего адреса и счетчика восстанавливаются из соответствующих базовых регистров. После автоинициализации канал готов выполнять другое обслуживание подсистемы DMA без вмешательства CPU, как только обнаружится достоверный DREQ.

Режим одиночной передачи (Single Transfer Mode)

В этом режиме контроллер DMA выполняет только одну передачу. Адрес и счетчик слов будут изменяться при каждой передаче. DREQ должен быть активным, пока не активизируется соответствующий DACK. Если DREQ активен на протяжении одиночной передачи, HRQ переходит в неактивное состояние по выполнении одной передачи и освобождает шину системе. HRQ снова станет активным (при активном DREQ) и по получении нового HLDA будет выполняться следующий цикл одиночной передачи. Это гарантирует CPU в системе выполнение одного полного машинного цикла между передачами DMA.

Режим передачи блока (Blok Transfer Mode)

В этом режиме передается блок информации во время обслуживания подсистемы DMA. DREQ должен быть активным, пока не появиться активный DACK.

Режим передачи по требованию (Demand Transfer Mode)

В этом режиме передача данных выполняется до тех пор, пока не появится TC или внешний -EOP, либо когда DREQ станет неактивным. Таким образом, передачи могут продолжаться до тех пор, пока периферийное устройство не исчерпает объем данных.

Каскадный режим (Cascade Mode)

Этот режим использует объединение нескольких контроллеров DMA для расширения числа подключаемых каналов. Выходы HRQ и входы HLDA от дополнительных контроллеров соединяются соответственно со входами DREQ и выходами DACK первичного контроллера DMA . Это дает возможность запросам от дополнительного устройства распространяться через сеть приоритетных цепей предшествующего устройства.

Таким образом, канал первичного контроллера DMA, к которому подключен дополнительный контроллер, программируется на выполнение каскадного режима и служит только для определения приоритета дополнительного устройства и транзита сигналов HRQ в CPU и HLDA из CPU. Все другие сигналы каскадного канала первичного контроллера DMA в формировании циклов подсистемы DMA не участвуют.

Режим память-память

Этот режим предназначен для передачи блоков данных из одного адресного пространства памяти в другое с минимальными программными и временными затратами, но в PC AT не используется. В данном режиме могут работать только нулевой и 1-й каналы контроллера. Эта передача инициируется программной установкой REQ для канала 0. Адрес ячейки памяти-источника данных задают в CAR0, а ячейки-приемника - в CAR1. Байт данных, считанный из памяти, заносится во временный регистр (TR) и затем из TR считывается в ячейку-приемник. Когда значение счетчика слов канала 1 станет равным FFFFh, обслуживание заканчивается.

Типы передач.

Каждый из трех активных режимов предполагает выполнение трех различных передач. Это ЧТЕНИЕ, ЗАПИСЬ и ПРОВЕРКА. Передача ЧТЕНИЕ пересылает данные из памяти в периферийное устройство при активизации -MEMR и -IOW. Передача ЗАПИСЬ пересылает данные из периферийного устройства в память при активизации -MEMW и -IOR. ПРОВЕРКА - это псевдопередача.
Подсистема DMA осуществляет передачи ЧТЕНИЯ или ЗАПИСИ, генерируя адреса и реагируя на -EOP, но сигналы управления памятью и периферийными устройствами остаются не активными. Вход READY игнорируется в ПРОВЕРКЕ.

Приоритеты.

Подсистема DMA имеет два типа приоритета, которые можно установить программно. Первый из них - фиксированный приоритет, который фиксирует каналы в последовательности, соответствующей убыванию их номеров.
Низший приоритет имеет канал номер 3, а высший приоритет имеет канал 0.
После выбора какого-либо канала для обслуживания запрещается вмешательство остальных каналов до тех пор, пока обслуживание не завершится.

Второй тип приоритета - циклический. Последний обслуженный канал становится каналом с низшим приоритетом согласно циклу. При циклическом приоритете любое устройство, требующее обслуживания, непременно будет распознано после обработки максимум трех более приоритетных обслуживаний. Это исключает монополизацию всей системы одним каналом.

Регистры контроллера DMA.

Регистр текущего адреса (CAR)

Каждый канал имеет 16-разрядный регистр текущего адреса. Этот регистр хранит младшие разряды адреса, используемые во время обслуживания ПДП.
Адрес автоматически уменьшается или наращивается после каждой передачи, а промежуточные значения адреса запоминаются в регистре во время передачи.
Содержимое текущего регистра записывается или читается микропроцессором побайтно.

Регистр текущего счетчика слов (CCR)

Каждый канал имеет 16-разрядный регистр текущего счетчика слов. Этот регистр определяет количество передач, которые необходимо выполнить. Количество передач будет на единицу больше, чем число, программируемое в регистре (т.е. в счетчик заносится число 100, а передач будет 101).

Значение счетчика уменьшается после каждой передачи, а промежуточное значение счетчика записывается в регистр во время передачи.

В режиме программирования регистр CCR может быть побайтно записан или прочитан микропроцессором. По концу обслуживания, если не задана автоинициализация, значение счетчика после TC равно FFFFH.

Между обслуживаниями, когда микропроцессору разрешается выполнять операции, промежуточные значения адреса и счетчика слов хранятся в регистрах текущего адреса и счетчика соответствующего канала.

Базовые регистры адреса и счетчика (BAR и CAR)

Каждый канал имеет два регистра: регистр базового адреса и регистр базового счетчика. Эти регистры хранят начальные значения соответствующих текущих регистров. При автоинициализации они используются для восстановления первоначальных значений текущих регистров. Базовые регистры загружаются микропроцессором поразрядно одновременно со своими текущими регистрами в режиме программирования. Считать содержимое базовых регистров нельзя.

Регистр режима (MOD - 00B, 0D6)

Каждый канал имеет 6-разрядный регистр режима (MOD). Запись в регистр производится в режиме программирования байтом, формат которого представлен на рисунке. Разряды 0, 1 указывают, в регистр режима какого канала нужно произвести запись, а разряды 2-7 - информацию непосредственно для соответствующего регистра режима. Для регистра режима разрешена только запись информации.

Регистр команд (CR - 008, 0D0)

Этот 8-разрядный регистр управляет операциями контроллера DMA. Он программируется микропроцессором и сбрасывается либо по входу RESET либо командой MC (очистка системы). Формат байта записи представлен на рис. Регистр команд не может быть считан микропоцессором.

Регистр запроса (REQ; 009, 0D2)

Контроллер DMA может реагировать на запросы по обслуживанию DMA, которые будут инициироваться программно, как и при DREQ. Каждый канал имеет свой разряд в 4-разрядном регистре запроса. Эти разряды немаскируемые, приоритет которых устанавливается шифратором приоритетов.
Каждый разряд регистра сбрасывается и устанавливается под управлением программы или очищается при генерации TC или внешнего -EOP. Весь регистр очищается по RESET. Разряд устанавливается или сбрасывается программой, которая загружет слово данных соответствующего формата, приведенного на рис.

Для того чтобы получить программный запрос, канал должен находиться в режиме блока. Регистр запроса не может быть считан микропоцессором.

Каждый канал имеет свой разряд в 4-разрядном регистре маски, который может быть установлен, чтобы заблокировать приходящий DREQ. Каждый разряд маски устанавливается, когда связанный с ним канал вырабатывает -EOP, если канал не запрограммирован на автоинициализацию (в этом случае по -EOP маска не устанавливается).
Каждый разряд 4-разрядного регистра маски может быть установлен или сброшен под управлением программы. Весь регистр устанавливается по RESET. При этом блокируются все запросы DMA, пока их не разрешит команда сброса регистра маски. Команда раздельной установки/сброса маски подобна команде раздельной установки/сброса регистра запроса. Одновременно все четыре разряда маски могут быть записаны отдельной командой - Write All Mask Register Bits. Регистр маски не может быть считан микропоцессором.

При инициализации регистра маски используются байты с форматами, приведенными на рис.

Рис. Формат байта для установки или сброса одного разряда MASK (00A, 0D4)

 

Рис. Формат байта для записи информации во все разряды MASK (00F, 0DE)

Регистр состояний (STAT - 008, 0D0)

Содержимое регистра состояния может быть прочитано микропроцессором. Регистр содержит информацию о состоянии каналов в данный момент времени. Эта информация показывает, какие каналы достигли заполнения счетчика (т.е. сгенерировали TC) и какие каналы имеют неудовлетворенные запросы Разряды 0-3 регистра устанавливаются каждый раз, как появляется TC для соответствующего канала или внешний -EOP. Эти разряды сбрасываются по RESET и при каждом чтении регистра состояния.

Разряды 4-7 устанавливаются всякий раз, когда соответствующий канал запрашивает обслуживание.

Временный регистр (TR - 00D, 0DA)

Регистр используется для хранения данных в течение передачи ПАМЯТЬ-ПАМЯТЬ. После окончания передач последнее слово может быть считано микропроцессором.
Регистр всегда содержит последний байт, переданный в предыдущей операции ПАМЯТЬ-ПАМЯТЬ, если не сброшен по RESET.

Программирование контроллера.

Контроллер DMA может программироваться процессором, когда HLDA не активен; это утверждение истинно, даже если активен HRQ. Ответственность процессора заключается в гарантии, что программирование контроллера и активный HLDA взаимоисключающие.
Если -CS и HLDA в низком состоянии, контроллер DMA входит в режим программирования. Выбор регистров при программировании осуществляется с помощью адресной шины A0-A3, работающей на вход, а выбор режима записи или считывания - с помощью сигналов -IOW или -IOR. При записи/считывании 16- разрядных регистров адреса или счетчика соответствующего канала необходим дополнительный разряд адреса, в качестве которого используется внутренний триггер FF. По FF=0 происходит обращение к младшему байту, а по FF=1 - к старшему байту регистра адреса или счетчика.
Кроме того, для контроллера существуют дополнительные специальные команды, которые могут быть выполнены в режиме программирования и не зависят от набора разрядов на шине данных. К ним относятся следующие команды:

Пример программирования подсистемы DMA.

PC AT использует канал 2 контроллера DMA для обмена с гибким диском. Чтобы получить доступ к верному адресу памяти, необходимо загрузить соответствующий регистр страниц. В данном случае для канала 2 это адрес порта 81h.

В приводимом примере ограничимся рассмотрением установки канала 2 для чтения одного сектора (512 байт) гибкого диска, начиная со смещения внутри страницы, содержащегося в BX. Программа имеет следующий вид:

mov al,46h ;Канал 2, передача одного байта, чтение с диска (4Аh для записи на диск)

out dma+0B,al ;Установить байтный режим

out dma+0C,al ;Сбросить триггер FF

mov al,bl ;Загрузить смещение адресов в текущий регистр страниц DMA

out dma+4,al

mov al,bh

out dma+4,al

mov al,0 ;Загрузить счетчик=512

out dma+5,al

mov al,2

out dma+5,al

out dma+0A,al ;Размаскировать канал 2 и читать сектор Примечание: dma - это базовый адрес, равный 00h.

Регенерация.

Оперативная память, как правило, строится на динамических элементах, которые требуют периодической регенерации, т.е. обновления заряда конденсатора, который и хранит информацию.

Осуществляется регенерация не сразу всей микросхемы памяти, а отдельных строк через некоторые промежутки времени. При этом время, через которое выполняется регенерация одной и той же строки, должно строго соблюдаться.
Для осуществления регенерации необходимо иметь два счетчика: первый - счетчик временных интервалов между запросами на регенерацию строк микросхем памяти, второй - счетчик перебора строк (счетчик адреса регенерируемой строки).

Первый счетчик является каналом 1 системного таймера (порт 41). Обычно этот канал настраивается на выдачу коротких импульсов с периодом 15 мкс, хотя в машинах последних моделей эта величина может быть больше.
Запрос на регенерацию фиксируется на триггере по отрицательному фронту DMACLK в отличие от запросов на обслуживание циклов DMA, которые фиксируются по положительному фронту (см. параграф "Режим прямого доступа к памяти"). Тем самым разнесены во времени моменты возникновения запросов от DMA и запросов на регенерацию. Первым будет обслуживаться тот запрос, который пришел раньше. По своему приоритету запросы являются равноправными. Запрос, который зафиксирован на триггере раньше, будет блокировать прохождение другого запроса (имеется в виду не два запроса на регенерацию, а один запрос от подсистемы DMA и один запрос на регенерацию). Если запрос на регенерацию пришел раньше запроса от подсистемы DMA, то его появление вызовет активизацию сигнала CPU HRQ, который является запросом микропроцессору на захват управления шиной.

С ростом тактовой частоты микропроцессора длительность цикла регенерации памяти на некоторых комплектах БИС может сокращаться. Это может привести к сбоям в работе некоторых адаптеров, которые имеют элементы памяти, рассчитанные на длинный цикл регенерации. Точно так же, как и цикл шины, выполняемый под управлением микропроцессора или контроллера DMA, цикл регенерации может быть растянут путем выдачи сигнала IOCHRDY низкого уровня.

Влияние регенерации на производительность микропроцессора.

Так как в выполнении цикла регенерации участвует шина, микропроцессор какую-то часть времени выполнения регенерации ожидает ее освобождения, что снижает его производительность. Причем чем выше тактовая частота микропроцессора, тем больше потери из-за регенерации. Поэтому для повышения производительности в машинах с современными элементами памяти реализуемая частота запросов на регенерацию ниже, чем была принята ранее.


Stay-at-home