Предыдущий раздел УПРАВЛЕНИЕ УСТРОЙСТВАМИ С ПРЕРЫВАНИЯМИ Следующий раздел

21.5. Прямой доступ в память

В рассмотренных выше драйверах для передачи каждого байта данных между ИУ и ОП приходится выполнять несколько машинных команд. Если в программе требуется выполнить ввод-вывод не одного, а целой последовательности байтов, то затраты времени ЦП на их передачу будут весьма существенны. Например, обмен данными с магнитным диском производится посекторно, то есть блоками по 512 байт.

Применение специального контроллера прямого доступа в память (ПДП) позволяет существенно снизить затраты времени ЦП, так как программа драйвера будет выполнять операции инициирования и завершения ввода-вывода не каждого байта, а лишь всего блока. В процессе ввода-вывода с использованием ПДП обмен байтами данных между ИУ и ОП производится не через регистр RD и регистры ЦП, а через контроллер ПДП. При этом роль ЦП ограничивается выдачей разрешений на занятие ОШ (а точнее – шины данных).

Обычно контроллер ПДП рассчитан на одновременное обслуживание нескольких ИУ (каждое ИУ подключается к нему набором проводников). Часть контроллера ПДП, предназначенная для обслуживания одного ИУ, называется каналом ПДП. Например, совместно с ЦП типа i8086 наиболее часто используется 4-канальный контроллер ПДП i8237. Этот контроллер расположен на системной плате и имеет следующее назначение каналов:

0 – предназначен для «освежения» памяти. Он постоянно восстанавливает заряд ячеек ОП;

1 – свободен;

2 – обмен с контроллером гибких дисков;

3 – обмен с контроллером жестких дисков.

Контроллер i8237 имеет общие для всех каналов регистры управления, а также для каждого канала свои регистры канала. В отличие от обычных RS, регистры управления не имеют битов состояния. К таким регистрам относятся регистр режима и регистр масок. Регистр режима (порт 0Bh) – 8-битный регистр (рис.77). Поясним смысл двух терминов: автоинициализация и тип передачи.

 

 

Рис. 77. Структура регистра режима

 

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

Тип передачи.  Контроллер ПДП поддерживает четыре различных режима передачи:

1) режим одиночной передачи – для передачи каждого байта в ОП (из ОП) контроллер ПДП запрашивает доступ к ОШ у ЦП;

2) режим блочной передачи – запрос на занятие ОШ делается один раз для всего блока;

3) режим передачи по требованию – контроллер ПДП ожидает подготовку байта контроллером устройства и делает запрос на занятие ОШ;

4) каскадный режим – используется в том случае, если ЭВМ имеет более одного контроллера ПДП.

Регистр масок – 4-битный регистр. Значение одного бита маскирует (1) или демаскирует (0) соответствующий канал. Доступ к регистру масок осуществляется через 8-битный порт 0Ah (рис.78).

 

 

Рис. 78. Структура порта для доступа к регистру масок

 

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

регистр начального адреса – содержит 16 младших битов начального адреса буфера – области ОП, в которую будет считываться (при чтении) блок байтов с ПУ. При записи, наоборот, информация из буфера будет переписываться на ПУ;

регистр страницы – содержит четыре старших бита 20-битового адреса буфера, с которым будет производиться обмен;

регистр счетчика – содержит число байтов, которое предстоит передать между ИУ и ОП, уменьшенное на 1.

Номера портов, используемых для доступа к регистрам канала, зависят от номера канала. Например, запись в регистры канала 2 производится через следующие 8-битные порты: регистр начального адреса – порт 4h; регистр страницы – порт 81h; регистр счетчика – порт 5h. Так как регистры начального адреса и счетчика 16-битные, то запись в них через 8-битные порты имеет следующую особенность.

Специальный регистр, называемый «защелкой», направляет содержимое 8-битного порта в младший или старший байт 16-битного регистра канала. Перед записью младшего байта в порт, соответствующий регистру канала, необходимо записать какое-нибудь значение в порт 0Ch, что приведет к сбросу «защелки». После записи младшего байта в регистр канала, установка «защелки» производится автоматически, и следующий байт из порта переписывается в качестве старшего байта регистра канала.

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

Драйвер дисковода предоставляет прикладным и системным программам возможность выполнять информационный обмен с установленным на дисковод магнитным диском. В результате одного обращения к драйверу производится чтение или запись одного сектора диска, то есть блока из 512 байтов, имеющего номер L (0LLMAX).

Получив от прикладной программы запрос на чтение или запись сектора, драйвер дисковода вызывает логическую процедуру «Инициализация канала 2», входящую в состав драйвера ПДП. Данная процедура имеет два входных параметра: «Начальный адрес прикладного буфера» и «Тип операции» (0 – чтение, 1 – запись). В процессе выполнения процедуры производится запись в регистры управления и в регистры канала 2. В частности, в регистрыначального адреса и страницы помещается начальный адрес прикладного буфера, а в регистр счетчика – число передаваемых байтов, уменьшенное на единицу.

 

 

Рис. 79. Логическая схема применения ПДП для информационного обмена с дисководом

 

После завершения инициализации канал 2 контроллера ПДП переходит в состояние «Вход 2», ожидая прихода от контроллера дисковода команды «Начать передачу». Эта команда инициирует работу контроллера ПДП по побайтовой передаче данных между контроллером дисковода и ОП.

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

Логическая процедура «Инициализация» выполняет две функции: 1) делает процедуры инициализации каналов резидентными; 2) заполняет векторы прерываний для доступа к этим резидентным процедурам. Программная реализация логической процедуры «Инициализация» аналогична реализации соответствующих процедур, рассмотренных ранее (см. п. 5.2 и 5.3).

Логическая процедура «Инициализация канала 2» включает следующие шаги:

Ш а г 1. В зависимости от типа операции (чтение или запись) сделать запись в регистр режима. При этом следует учесть следующие характеристики режима:

1) автоинициализация выключена;

2) текущий адрес при обмене увеличивается;

3) тип передачи одиночный.

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

Ш а г 3. Запись в регистр счетчика числа байтов, предназначенных для пересылки, уменьшенного на единицу, то есть числа 511.

Ш а г 4. Запись в регистр маски контроллера ПДП числа, разрешающего работу канала 2.

Ш а г 5. Возврат из процедуры.

Ниже приведен фрагмент программы драйвера ПДП, выполняющий инициализацию канала 2. Так как данный фрагмент резидентен, то он вызывается через программное прерывание. В качестве номера прерывания выбрано число EDh.

 

; Подготовка канала 2  ПДП к чтению-записи сектора гибкого диска –

;        обработчик программного прерывания с номером EDh

; -----------------------------------------------------------------------------------------------------

;   Входы:   DX:BX – адрес буфера (сегмент:смещение)

;                  AL – тип операции (0 – чтение, 1 – запись)

;

    Begin:               sti                                          ;Разрешить маскируемые прерывания

push           ax                        ; Сохранение

push           bx                        ;        содержимого

push           cx                        ;             регистров

push           bp                        ;                  в стеке

cmp            al, 0                    ; Операция – чтение ?

jnz              .Sap                    ; Нет

mov            al, 01000110b     ; Задание режима для

out             0bh, al                ;     чтения диска

jmp             .Adr

.Sap:  

mov            al, 01001010b     ; Задание режима для

out             0bh, al                ;       записи на диск

.Adr:   

mov            ax, dx                  ; Адрес-сегмент  àAX

mov            bp, 16

mul             bp                        ;  (AX)*(BP) à DX:AX

add            bx, ax                   ; Младшие 16 бит адреса àBX

mov            cx, 0                    ;    0 àCX

adc             dx, cx                  ; Старшие биты адреса àDX

mov            al, dl                   ; Запись в

out             81h, al                 ;    регистр страницы

out             0ch, al                  ; Сброс «защелки»

mov            al, bl                    ; Запись младшего байта

out             4h, al                    ;     в регистр начального адреса

mov            al, bh                    ; Запись старшего байта

out             4h, al                    ;     в регистр начального адреса

out             0ch, al                  ; Сброс «защелки»

mov            ax, 511                 ; Запись младшего байта

out             5h, al                    ;     счетчика байтов

mov            al, ah                    ; Запись старшего байта

out             5h, al                    ;     счетчика байтов

mov            al, 2                     ; Размаскирование

out             0ah, al                 ;     канала 2

pop            bp                        ; Восстановление

pop            cx                        ;       содержимого

pop            bx                        ;            регистров

pop            ax                        ;                из стека

iret                                       ; Возврат в программу из прерывания

 


Предыдущий раздел В начало Следующий раздел