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

Скачать доклад: Контроллер прямого доступа к памяти

Прямой доступ к памяти (Direct Memory Access - DMA) используется для выполнения операций передачи данных непосредственно между оперативной памятью и устройствами ввода/вывода. Обычно это такие устройства, как НГМД, НЖМД, кассетные накопители на магнитной ленте КНМЛ (стриммеры).

При использовании ОМА процессор не участвует в операциях ввода/вывода, контроллер прямого доступа сам формирует все сигналы, необходимые для обмена данными с устройством. Скорость такого непосредственного обмена значительно выше, чем при традиционном вводе/выводе с использованием центрального процесора и команд INP, OUT.

Контроллер прямого доступа IBM PC/XT

Контроллер прямого доступа для IBM PC/XT реализован на базе микросхемы Intel 8237A и содержит четыре канала. Эти каналы используются следующим образом:

0 - обновление содержимого динамической памяти компьютера, этот канал имеет наивысший прморитет;

1 - не используется;
2 - адаптер НГМД;
3 - адаптер НЖМД.

Канал 0 имеет наивысший приоритет, канал 3 - низший.

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

Каждый канал содержит 16-разрядные регистры:

- регистр текущего адреса CAR, содержит текущий адрес ячейки памяти при выполнении операции обмена данными с использованием DMA;

- регистр циклов прямого доступа к памяти CWR, содержит число слов, предназначенных для передачи минус единица;  при выполнении обмена данными регистр работает в режиме вычитания;

- регистр хранения базового адреса BAR, используется для хранения базового адреса памяти, используемого при передаче данных; в процессе работы канала DMA содержимое этого регистра не изменяется;

- регистр хранения базового числа циклов прямого досту к памяти WCR; он хранит число циклов DMA, его содержимое также не изменяется;

- регистр режима MR, определяющий работу канала.

Приведем адреса регистров и их форматы для компьютера IBM PC/XT.

Порты 00h - 07h

Эти регистры содержат базовые адреса и счетчики передаваемых данных каналов О - 3. Их назначение следующее:

00h     Запись: Базовый адрес канала О
        Чтение: Текущий адрес
01h     Запись: Счетчик канала О
        Чтение: Текущий адрес
02h     Запись: Базовый адрес канала 1
        Чтение: Текущий адрес
03h     Запись: Счетчик канала 1
        Чтение: Текущий адрес
04h     Запись: Базовый адрес канала 2
        Чтение: Текущий адрес
05h     Запись: Счетчик канала 2
        Чтение: Текущий адрес
06h     Запись: Базовый адрес канала 3
        Чтение: Текущий адрес
07h     Запись: Счетчик канала 3
        Чтение: Текущий адрес

Порт 08h

Этот порт используется при записи в качестве управляющего регистра и при чтении как регистр состояния.

Формат управляющего регистра:

 7 6 5 4 З 2 1 0
--T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
LT+T+T+T+T+T+T+T-
 ¦ ¦ ¦ ¦ ¦ ¦ ¦ L- 1 - использование режима память-память;
 ¦ ¦ ¦ ¦ ¦ ¦ ¦    0 - обычный режим работы
 ¦ ¦ ¦ ¦ ¦ ¦ ¦
 ¦ ¦ ¦ ¦ ¦ ¦ L--- если используется режим память-память,то 1
 ¦ ¦ ¦ ¦ ¦ ¦      этом разряде разрешает захват канала,
 ¦ ¦ ¦ ¦ ¦ ¦      0 - запрещает; в обычном режиме работы
 ¦ ¦ ¦ ¦ ¦ ¦      состояние этого бита безразлично
 ¦ ¦ ¦ ¦ ¦ ¦
 ¦ ¦ ¦ ¦ ¦ L----- 1 - запрет работы DMA;
 ¦ ¦ ¦ ¦ ¦        0 - разрешение работы DMA
 ¦ ¦ ¦ ¦ ¦
 ¦ ¦ ¦ ¦ L------- 1 - использование сжатия во времени, если
 ¦ ¦ ¦ ¦              установлен бит обычного режима работы;
 ¦ ¦ ¦ ¦          0 - обычный режим работы
 ¦ ¦ ¦ ¦
  ¦ ¦ ¦ L--------- 1 - вращение приоритетов:
 ¦ ¦ ¦            0 - фиксированные приоритеты
 ¦ ¦ ¦
 ¦ ¦ L----------- 1 - удлиненный цикл записи;
 ¦ ¦              0 - нормальный цикл записи
 ¦ ¦
 ¦ L------------- 1 - используется низкий уровень для
 ¦                    сигнала запроса на DMA DREQ;
 ¦                0 - используется высокий уровень
 ¦
  L--------------- 1 - используется высокий уровень для
                      сигнала запроса на DMA DACK;
                  0 - используется низкий уровень

Обычно этот регистр инициализируется BIOS в процессе тестирования системы, и впоследствии изменять режим работы контроллера DMA не требуется. Ошибки при инициализации этого порта могут привести к "зависанию" системы.

При чтении из порта 08h программа получает слово состояния контроллера DMA:

 7 6 5 4 З 2 1 0
--T-T-T-T-T-T-T-¬
¦       ¦       ¦
L-+-+-+-+-+-+-+--
 L--T--- L-----+- Биты 0-3 устанавливаются  в  1  при  достижении
    ¦             счетчиками каналов 0-3 конечных значений
    ¦
    L------------ Биты 4-7 установлены в 1, если имеется
                  разрешение на DMA соответственно каналов 0-3

Порт 09h

Регистр запроса. Предназначен для организации программного (а не аппаратного) запроса на DMA. Для использования программного запроса канал должен быть запрограммирован в режиме блочной передачи. Формат регистра:

 7 6 5 4 З 2 1 0
--T-T-T-T-T-T-T-¬
¦         ¦ ¦   ¦
L-+-+-+-+-+T+-+--
 L---T---- ¦ L-+- Номер используемого канала:
     ¦     ¦        00 - канал О;  10 - канал 2;
     ¦     ¦        01 - канал;    11 - канал 3
     ¦     ¦
     ¦     L----- 0 - установить запрос; 1 - сбросить запрос
     ¦
     L----------- Не используются.

Порт 0Ah

Регистр маски. Используется для маскирования запросов на прямой доступ для отдельных каналов:

 7 6 5 4 З 2 1 0
--T-T-T-T-T-T-T-¬
¦         ¦ ¦   ¦
L-+-+-+-+-+T+-+--
 L---T---- ¦ L-+- Номер канала:
     ¦     ¦        00 - канал О;  10 - канал 2;
     ¦     ¦        01 - канал;    11 - канал 3
     ¦     ¦
     ¦     L----- 0 - установить маску; 1 - сбросить маску
     ¦
     L----------- Не используются.

Порт 0Bh

Регистр режима. Служит для определения режимов работы калов контроллера DMA:

 7 6 5 4 З 2 1 0
--T-T-T-T-T-T-T-¬
¦   ¦ ¦ ¦   ¦   ¦
L-+-+T+T+-+-+-+--
 LT- ¦ ¦ LT- L-+- Номер канала:
  ¦  ¦ ¦  ¦         00 - канал О;  10 - канал 2;
  ¦  ¦ ¦  ¦         01 - канал;    11 - канал 3
  ¦  ¦ ¦  ¦
  ¦  ¦ ¦  L------ Тип цикла DMA:
  ¦  ¦ ¦            00 - цикл проверки;
  ¦  ¦ ¦            01 - цикл записи;
  ¦  ¦ ¦            10 - цикл чтения;
  ¦  ¦ ¦            11 - запрещеннная комбинация.
    ¦  ¦ ¦
  ¦  ¦ L--------- 1 - режим автоинициализации
  ¦  ¦
  ¦  L----------- Приращение адреса:
  ¦                 0 - инкрементирование, 1 декрементирование
  ¦
  L-------------- Режим обслуживания
                    00 - передача по требованию;
                    01 - одиночная передача;
                    10 - блочнная передача;
                    11 - каскадирование

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

Порт 0Dh

Запись в этот порт вызывает сброс контроллера. Для дальнейшего использования контроллер должен быть заново проинициализирован.

Порт 0Eh

Сброс регистра маски. После записи в этот регистр любого значения разрешается работа всех четырех каналов прямого доступа.

Порт 0Fh

Маскирование/размаскирование каналов. С помощью этого порта можно выполнить одновременное маскирование или размаскирование нескольких каналов:

 7 6 5 4 З 2 1 0
--T-T-T-T-T-T-T-¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
L-+-+-+-+T+T+T+T-
 L--T--- ¦ ¦ ¦ L- 1 - маскирование канала 0;
    ¦    ¦ ¦ ¦    0 - разрешение канала 0
    ¦    ¦ ¦ ¦
    ¦    ¦ ¦ L--- 1 - маскирование канала 1;
    ¦    ¦ ¦      0 - разрешение канала 1
    ¦    ¦ ¦
    ¦    ¦ L----- 1 - маскирование канала 2:
    ¦    ¦        0 - разрешение канала 2
    ¦    ¦
    ¦    L------- 1 - маскирование канала 3:
    ¦             0 - разрешение канала 3/>    ¦
        L------------ Не используются

Порты 81h-8Fh

Это порты регистров страниц.

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

     81h Регистр страниц канала 2
     82h Регистр страниц канала 3>          83h Регистр страниц канала 1

9.1.2. Инициализация канала DMA

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

     - сбросить триггер байтов командой записи в регистр 0Ch;
          - задать режим работы канала, выполнив запись по адресу
       0Bh в регистр режима MR;
     - заслать младшие 16 битов 20-битового адреса области па-
       мяти, которая будет использована для передачи данных, в
       регистр базового адеса (адрес порта зависит от номера ка-
       нала: 0-й канал использует адрес 00h, 1-й канал - 02h,
       2-и канал - 04h, З-й канал - 06h);
     - заслать номер страницы (старшие 4 бита 20-битового адре-
       са) в соответствующий регистр страниц (81h, 82h или 83h);
     - загрузить регистр циклов прямого доступа к памяти CWR
       значением, на 1 меньшим требуемого количества переда-
       ваемых байтов (адреса этих портов для каналов 0...3 соот-
              ветственно 01h, 03h, 05h, 07h);
     - разрешить работу канала, выполнив запись в регистр маски
       каналов по адресу 0Ah.

Сразу после разрешения канал начинает передачу данных. Окончив передачу, устройство обычно вырабатывает прерывание, которое служит признаком окончания передачи данных.

Контроллер прямого доступа для IBM AT

Контроллер DMA компьютера IBM AT совместим снизу вверх с контроллером IBM PC/XT. Он состоит из двух каскадно включенных микросхем Intel 8237A-5. Второй контроллер обслуживает каналы DMA с номерами 4-7.

Приведем назначение каналов DMA для IBM AT:

0 - Зарезервировано
1 - Управление синхронной передачей данных SDLC
2 - Адаптер накопителя на гибком магнитном диске (НГМД)
3 - Адаптер накопителя на магнитном диске (НЖМД);
4 - Используется для каскадного соединения с первым
    контроллером DMA.
5-6 Зарезервировано

Другое отличие - это разрядность каналов. Каналы 0-3 являются каналами 8-битовой передачи данных, а каналы 4-7 обеспечивают 16-битовую передачу данных. В связи с этим используются все 8 битов регистров страниц. Формируется 24-битовый адрес из 16 младших битов адреса, записываемых в базовые регистры, и 8 старших битов адреса, записываемых в регистры страниц.

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

Приведем назначение и адреса регистров страниц контроллера для IBM AT:

81h  -  Регистр страниц канала 2
82h  -  Регистр страниц канала 3
83h  -  Регистр страниц канала 1
87h  -  Регистр страниц канала 0
89h  -  Регистр страниц канала 6
8Bh  -  Регистр страниц канала 5
8Ah  -  Регистр страниц канала 7
8Fh  -  Регенерация динамической памяти

Для 16-битовых каналов 4-7 передача данных начинается с границы слова и все адреса относятся к 16-битовым словам.

Порты 0C0h-0CFh

Эти регистры содержат базовые адреса и счетчики передаваемых данных каналов 4-7. Их назначение следующее:

0C0h - Запись: Базовый адрес канала 4
       Чтение: Текущий адрес
0C2h - Запись: Счетчик канала 4
       Чтение: Текущий адрес
0C4h - Запись: Базовый адрес канала 5
       Чтение: Текущий адрес
0C6h - Запись: Счетчик канала 5
       Чтение: Текущий адрес
0C8h - Запись: Базовый адрес канала 6
       Чтение: Текущий адрес
0CAh - Запись: Счетчик канала 6
       Чтение: Текущий адрес
0CCh - Запись: Базовый адрес канала 7
       Чтение: Текущий адрес
0CEh - Запись: Счетчик канала 7
              Чтение: Текущий адрес

Порты 0D0h-0DFh

Это управляющие порты и порты состояния второй микросхемы 8237A-5. По формату и назначению они соответствуют рассмотренным ранее для контроллера DMA компьютеров IBM PC/XT:

0D0h - Управляющий регистр/регистр состояния
0D2h - Регистр запроса
0D4h - Регистр маски
0D6h - Регистр режима
0D8h - Сброс триггера байтов
0DAh - Сброс контроллера
0DCh - Сброс регистра маски
0DEh - Маскирование/размаскирование каналов