В качестве источников для этого вопроса использовалась синяя библия (стр. 189-192).

Организация прямого доступа к памяти. Контроллер ПДП

Что такое ПДП и зачем он нужен

Прямой доступ к памяти (ПДП / DMA - Direct Memory Access) — это аппаратный режим обмена данными, при котором внешнее устройство (ВУ) читает или пишет информацию в оперативную память напрямую, без какого-либо участия центрального процессора.

Этот режим критически необходим по двум причинам:

  1. Высокая скорость ВУ: Современные накопители (в книге приводятся в пример жесткие магнитные диски) передают данные с такой огромной скоростью, что процессор физически не успевал бы обрабатывать каждый байт в программно-управляемом режиме (цикл программы просто дольше, чем время прихода нового байта).
  2. Разгрузка процессора: Процессор освобождается от рутинного перекладывания байтов из порта в память и может заниматься полезными вычислениями.

Управляет этим процессом специализированная микросхема — Контроллер ПДП.

Режимы разделения системной шины

Поскольку процессор и контроллер ПДП “сидят” на одной и той же системной шине (адреса, данных и управления), они не могут пользоваться ею одновременно. Контроллер ПДП должен отбирать шину у процессора. Есть два основных способа:

  1. ПДП с блокировкой процессора (Блочный обмен) Контроллер запрашивает доступ, процессор отключается от шины, и контроллер ПДП “монополизирует” её на всё время передачи целого блока данных (сотен или тысяч байт). Процессор в это время полностью простаивает.
  2. ПДП с «захватом цикла» (Cycle Stealing) Самый распространенный и эффективный способ. Контроллер ПДП принудительно отключает процессор от шины (переводя его выходы в состояние высокого напряжения) только на время передачи одного байта или слова. Процессор “замирает” буквально на один такт, пропускает байт ПДП в память, а затем сразу продолжает свою работу, пока ВУ готовит следующий байт.

Контроллер ПДП приёма данных из ВУ на примере захвата цикла

В контроллере ПДП обязательно присутствуют минимум два аппаратных узла:

  • Счетчик байтов: хранит размер передаваемого блока.
  • Регистр адреса (AR): хранит текущий адрес ОЗУ, куда нужно записать (или откуда считать) данные.

Порядок обмена:

  1. Инициализация (Подготовка): Программная часть. Процессор с помощью обычных команд вывода записывает в контроллер ПДП начальный адрес памяти и количество байт (размер блока). После этого процессор уходит выполнять свои задачи.
  2. Запрос от ВУ: Внешнее устройство передает байт в регистр данных контроллера ПДП.
  3. Захват шины: Логика контроллера генерирует на системную шину аппаратный сигнал ТПДП («Требование прямого доступа к памяти»). Процессор доделывает текущую микрооперацию, отключается от шин и в ответ выдает сигнал ППДП («Предоставление ПДП»).
  4. Передача данных: Получив контроль, контроллер ПДП выставляет свой Регистр адреса на шину адреса, выставляет данные на шину данных и дёргает линию «Запись» (или «Чтение») памяти. Байт улетает напрямую в ОЗУ.
  5. Аппаратное обновление: В самом контроллере аппаратно (без процессора) Регистр адреса увеличивается на +1, а Счетчик байтов уменьшается на -1.
  6. Освобождение: Контроллер снимает сигнал ТПДП, возвращая управление шиной процессору.
  7. Конец блока: Шаги 2–6 повторяются для каждого байта, пока Счетчик байтов не станет равен 0. Когда это происходит, контроллер ПДП генерирует обычное прерывание, сообщая процессору: “Блок успешно загружен в память”.

Рис. 1: Схема работы контроллера ПДП в режиме захвата цикла

Логика работы вентилей «И», «И1» и «И2» на схеме контроллера ПДП

Эти элементы аппаратно координируют действия автомата контроллера ПДП [рис. 8.16]:

  • «И1» (Запрос): Объединяет сигнал готовности ВУ («Ввод данных») и внутренний статус активности. Если ВУ прислало байт, а счётчик не равен нулю, выдаёт на шину сигнал «Требование ПДП».
  • «И2» (Исполнение): Срабатывает только тогда, когда процессор дал доступ («Предоставление ПДП») И контроллер готов. Этот импульс одновременно:
    1. открывает приёмопередатчики для выгрузки данных на шину («Чтение РД»)
    2. увеличивает адрес в РА на +1
    3. уменьшает счётчик на -1.
  • «И» в самом низу (Детектор нуля): Постоянно следит за битами счётчика байтов. Как только все биты обнуляются (блок данных передан полностью), элемент И срабатывает через инверсию, прекращая генерацию требований ПДП и сигнализируя процессору о завершении обмена.