Прямой доступ к памяти (Direct Memory Access - DMA) применяется для выполнения операций передачи данных непосредственно между оперативной памятью и устройствами ввода/вывода. Обычно это такие устройства, как НГМД, НМД, стримеры.
При использовании DMA процессор не участвует в операциях ввода/вывода. Контроллер прямого доступа сам формирует все сигналы, необходимые для обмена данными с устройством. Скорость такого непосредственного обмена значительно выше, чем при традиционном обмене с использованием центрального процессора и команд INP, OUT.
Заметим, что контроллеры DMA в компьютерах IBM PC/XT IBM PC/AT различаются, но совместимы снизу вверх. Поэтому вначале мы расскажем о первом типе контроллеров, затем займемся контроллером DMA компьютера IBM PC/AT.
Контроллер прямого доступа IBM PC/XT реализован на базе микросхемы Intel 8237A и содержит четыре канала. Эти каналы используются следующим образом:
Номер канала |
Для чего применяется |
0 |
Обновление содержимого динамической памяти компьютера. |
1 |
Не используется |
2 |
Адаптер накопителя на гибком магнитном диске НГМД |
3 |
Адаптер накопителя на магнитном диске НМД. |
Каждый канал DMA содержит следующие 16-разрядные регистры:
Приведем адреса регистров и их форматы для компьютеров IBM PC/XT.
Эти регистры содержат базовые адреса и счетчики передаваемых данных каналов 0 - 3. Их назначение приводится в следующей таблице:
Порт |
Операция |
Назначение |
PRIVATE00h |
Запись: |
Базовый адрес канала 0 |
Чтение: |
Текущий адрес |
|
01h |
Запись: |
Счетчик канала 0 |
Чтение: |
Текущий адрес |
|
02h |
Запись: |
Базовый адрес канала 1 |
Чтение: |
Текущий адрес |
|
03h |
Запись: |
Счетчик канала 1 |
Чтение: |
Текущий адрес |
|
04h |
Запись: |
Базовый адрес канала 2 |
Чтение: |
Текущий адрес |
|
05h |
Запись: |
Счетчик канала 2 |
Чтение: |
Текущий адрес |
|
06h |
Запись: |
Базовый адрес канала 3 |
Чтение: |
Текущий адрес |
|
07h |
Запись: |
Счетчик канала 3 |
Чтение: |
Текущий адрес |
Этот порт используется при записи в качестве управляющего регистра и при чтении как регистр состояния.
Формат управляющего регистра:
Поле |
Описание |
0 |
1 - использование режима память-память; |
1 |
Если используется режим память-память, то 1 в этом разряде разрешает захват канала, 0 – запрещает. В обычном режиме работы состояние этого бита безразлично |
2 |
1 - запрет работы DMA; |
3 |
1 - использование сжатия во времени, если установлен бит обычного режима работы; |
4 |
1 – циклическое изменение приоритетов; |
5 |
1 - удлиненный цикл записи; |
6 |
1 - для сигнала запроса на DMA используется низкий уровень DREQ; |
7 |
1 - для сигнала подтверждения DMA DACK используется высокий уровень; |
Обычно управляющий регистр инициализируется BIOS в процессе тестирования системы. Впоследствии изменять режим работы контроллера DMA не требуется. Ошибки при инициализации этого порта могут привести к нарушению нормальной работы операционной системы.
При чтении из порта 08h программа получает слово состояния контроллера DMA:
Поле |
Описание |
0-3 |
Биты 0-3 устанавливаются при достижении счетчиками каналов 0-3 конечных значений; |
4-7 |
Биты 4-7 установлены, если имеется разрешение на DMA, соответственно, каналов 0-3 |
Регистр запроса. Предназначен для организации программного (а не аппаратного) запроса на DMA. Для использования программного запроса канал должен быть запрограммирован в режиме передачи блоков данных.
Формат регистра:
Поле |
Описание |
0-1 |
Номер канала: |
2 |
0 – установить запрос; |
3-7 |
Не используются |
Регистр маски. Применяется для маскирования запросов на прямой доступ для отдельных каналов:
Поле |
Описание |
0-1 |
Номер канала: |
2 |
0 - установить маску; |
3-7 |
Не используются |
Регистр режима. Служит для определения режимов работы каналов контроллера DMA:
Поле |
Описание |
0-1 |
Номер канала: |
2-3 |
Тип цикла DMA: |
4 |
1 - режим автоинициализации |
5 |
Приращение адреса: |
6-7 |
Режим обслуживания: |
Сброс триггера байтов. Для загрузки внутренних 16-разрядных регистров контроллера используется последовательный вывод младшего, затем старшего байтов слова. После сброса триггера байтов можно начинать загрузку 16-разрядных регистров.
Запись в этот порт вызывает сброс контроллера. Для дальнейшего использования контроллер должен быть заново проинициализирован.
Сброс регистра маски. После записи в этот регистр любого значения разрешается работа всех четырех каналов прямого доступа.
Маскирование или размаскирование каналов. С помощью этого порта можно выполнить одновременное маскирование или размаскирование нескольких каналов:
Поле |
Описание |
0 |
1 - маскирование канала 0; |
1 |
1 - маскирование канала 1; |
2 |
1 - маскирование канала 2; |
3 |
1 - маскирование канала 3; |
4-7 |
Не используются |
Это порты регистров страниц.
Для работы с памятью контроллер прямого доступа IBM PC/XT использует 20-разрядные физические адреса. Шестнадцать младших битов адреса необходимо записать в регистр базового адреса канала. Четыре старших бита (биты 16-19) должны быть записаны в соответствующие порты регистров страниц.
При инициализации регистров базового адреса и регистра страниц необходимо следить за тем, чтобы в процессе передачи данных не происходил переход за границу 64 Кбайт.
Для адресации регистров страниц можно использовать следующие порты:
Порт |
Описание |
81h |
Регистр страниц канала 2 |
82h |
Регистр страниц канала 3 |
83h |
Регистр страниц канала 1 |
Для инициализации канала программа должна выполнить следующие шаги:
Сразу после разрешения канал начинает передачу данных. После окончания передачи устройство обычно вырабатывает прерывание, которое служит признаком окончания операции ввода или вывода данных.
Контроллер DMA компьютера IBM PC/AT совместим снизу вверх с контролером IBM PC/XT. Он состоит из двух каскадно включенных микросхем Intel 8237A-5. Второй контроллер обслуживает каналы DMA с номерами 4-7.
Приведем назначение каналов DMA для IBM AT:
Поле |
Описание |
0 |
Зарезервировано |
1 |
Зарезервировано |
2 |
Адаптер накопителя на гибком магнитном диске (НГМД) |
3 |
Адаптер накопителя на магнитном диске (НМД) |
4 |
Используется для каскадного соединения с первым контроллером DMA |
5-7 |
Зарезервировано |
В разных моделях компьютеров назначение каналов DMA могут различаться. Кроме того, современные компьютеры допускают изменение назначения каналов с помощью программы BIOS Setup.
Каналы 0-3 являются 8-разрядными, а каналы 4-7 - 16-разрядными.
В связи с этим используются все 8 бит регистров страниц. Формируется 24-битовый адрес из 16 младших бит адреса, которые записываются в базовые регистры и 8 старших бит адреса, которые записываются в регистры страниц.
Размер страницы составляет 128 Кбайт, поэтому при передаче данных с использованием DMA не должна пересекаться граница 128 Кбайт.
Приведем описание регистров каналов DMA для IBM PC/AT.
Приведем назначение и адреса регистров страниц контроллера для IBM AT:
Порт |
Описание |
81h |
Регистр страниц канала 2 |
82h |
Регистр страниц канала 3 |
83h |
Регистр страниц канала 1 |
87h |
Регистр страниц канала 0 |
89h |
Регистр страниц канала 6 |
8Bh |
Регистр страниц канала 5 |
8Ah |
Регистр страниц канала 7 |
8Fh |
Регенерация динамической памяти |
Для 16-разрядных каналов 4-7 передача данных начинается с границы слова и все адреса относятся к 16-разрядным словам.
Эти регистры содержат базовые адреса и счетчики передаваемых данных каналов 4-7. Их назначение приводится ниже:
Порт |
Операция |
Назначение |
0C0h |
Запись: |
Базовый адрес канала 4 |
Чтение: |
Текущий адрес |
|
0C2h |
Запись: |
Счетчик канала 4 |
Чтение: |
Текущий адрес |
|
0C4h |
Запись: |
Базовый адрес канала 5 |
Чтение: |
Текущий адрес |
|
0C6h |
Запись: |
Счетчик канала 5 |
Чтение: |
Текущий адрес |
|
0C8h |
Запись: |
Базовый адрес канала 6 |
Чтение: |
Текущий адрес |
|
0CAh |
Запись: |
Счетчик канала 6 |
Чтение: |
Текущий адрес |
|
0CCh |
Запись: |
Базовый адрес канала 7 |
Чтение: |
Текущий адрес |
|
0CEh |
Запись: |
Счетчик канала 7 |
Чтение: |
Текущий адрес |
Это управляющие порты и порты состояния второй микросхемы 8237A-5. По формату и назначению они соответствуют рассмотренным ранее для контроллера DMA компьютеров IBM PC/XT:
Порт |
Назначение |
PRIVATE0D0h |
Управляющий регистр, регистр состояния |
0D2h |
Регистр запроса |
0D4h |
Регистр маски |
0D6h |
Регистр режима |
0D8h |
Сброс триггера байтов |
0DAh |
Сброс контроллера |
0DCh |
Сброс регистра маски |
0DEh |
Маскирование и размаскирование каналов |