Предыдущий раздел | УПРАВЛЕНИЕ УСТРОЙСТВАМИ С ПРЕРЫВАНИЯМИ | Следующий раздел |
В рассмотренных выше драйверах для передачи каждого байта данных между ИУ и ОП приходится выполнять несколько машинных команд. Если в программе требуется выполнить ввод-вывод не одного, а целой последовательности байтов, то затраты времени ЦП на их передачу будут весьма существенны. Например, обмен данными с магнитным диском производится посекторно, то есть блоками по 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 (0 ≤ L ≤ LMAX).
Получив от прикладной программы запрос на чтение или запись сектора, драйвер дисковода вызывает логическую процедуру «Инициализация канала 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 ; Возврат в программу из прерывания
Предыдущий раздел | В начало | Следующий раздел |