Тогда применяются процессоры ввода/вывода (ПВВ).
Они также имеют собственную систему команд, но могут управлять системной шиной. Следовательно, в памяти можно изолировать команды ЦП и ПВВ.
Отличие ПВВ от ЦП: ЦП никогда не останавливается. ПВВ останавливается по завершению операции.
ПВВ часто называют канальным процессором, а его программу – канальной программой.
Применяются для управления [произвольным] оборудованием (нужно только загрузить нужную программу) (например, в Mainframe’ах IBM).
Самый простой способ.
Драйвер ВУ должен знать, какой регистр за что отвечает. Драйвер может в любой момент времени обратиться к любому регистру.
Преимущества:
- разработчик драйвера наиболее свободен в выборе – когда и что делать;
- за 1 цикл шины позволяет обращаться к запрошенному регистру (нет задержки).
Недостаток: если устройство сложное, нужно много регистров, а разрядность шины регистров ограничена.
Следовательно, нужно экономить регистры! (см. след. тему).
Число регистров в КВУ уменьшить невозможно (сколько есть, столько есть). Регистры эти имеют некоторые адреса внутри КВУ и не отображаются на шину.
На шину отображаются два регистра – регистр номера регистра и регистр данных.
Алгоритм работы:
Надо сгенерировать два цикла шины:
Цикл 1: число, обозначающее номер регистра в рег. # регистра.
Цикл 2: данные передаются из регистра данных во внутренний регистр с этим номером, либо коммутируются внутри регистра на шину (прямо так, без пересылки данных из него в регистр данных).
Драйвер может опять в любой момент обращаться к любому регистру, но существует задержка, т.к. требуется два цикла шины.
Примечание: для ВУ с большим числом регистров, доступ к которым осуществляется редко (пример: часы реального времени (70h и 71h – регистры номера и данных) и CMOS-память – используются только в момент загрузки компьютера).
Если надо гонять часто большие объемы данных, механизм косвенной адресации неприменяем!
В случае быстрых устройств и больших объемов данных необходимо выставить мало регистров на шину, но чтобы не тратилось два цикла шины.
Смысл: любое устройство, работающее с таким КВУ имеет фиксированный набор команд и строго определенный порядок загрузки регистров для каждой команды.
Регистры уже не доступны драйверу по номеру, Номер регистра, в который будет помещена информация, определяется самой командой, а не драйвером.
Надо выполнить транзакцию и передачу КВУ данных, необходимых для данной операции. А КВУ сам распихает их по своим регистрам и запустит операцию.
В регистр команд загружаем команду (например, «читать сектор»). После этого последовательно помещаем все необходимые данные для этой команды в рег. данных.
После получения всего блока данных транзакция управления завершена, КВУ получает результат.
Чтобы не было бесконечного ожидания, считается, что любая операция записи в регистр команд сбрасывает предыдущую команду, если только она еще не выполняется.
Недостаток: в драйверах уже нельзя просто так использовать многопоточность, т.к. регистры должны запоминаться в нужном порядке.
Как еще можно снизить диапазон адресов? (см. след. тему).
Можно организовать так называемый канал управления (для обмена командами с КВУ).
ПДП (DMA) может использоваться как для обмена данными, так и для обмена командами.
Заполняем программную копию регистров ВУ в ОЗУ требуемыми значениями и толкаем операцию ПДП.
Контроллер ПДП копирует блок из ОЗУ в регистры ВУ. Затем, КВУ автоматически начинает производить операцию.
Также в любой момент мы можем скопировать регистры ВУ в ОЗУ.
Недостаток: для организации обмена требуется ПДП.
КВУ должно поддерживать механизм ПДП. Ему нужно два канала: для данных и для управления. В Intel количество каналов ПДП ограничено, поэтому отказались от этого механизма.
В ВС с большими диапазонами АП актуальность сужения диапазона адресов уменьшается (для 32, 64 бит). Так что используют простое отображение регистров ВУ на шину.
В
Status-регистре любого устройства всегда есть бит Ready (чаще всего он в знаковом разряде).
При поступлении команды в регистр команд аппаратура сбрасывает этот бит. При завершении команды бит снова устанавливается.
Readybit можно проверять в цикле или по таймауту.
Для большого числа устройств работа в режиме polling’а неприемлема. Для асинхронных устройств этот режим вообще неприемлем.
Появился режим прерываний (см. след. тему).
Задачи:
1) Проинформировать ЦП о завершении операции ввода/вывода.
2) Найти ту программу, которая может обработать это прерывание.
Была разработана схема, названная «векторной таблицей».
Все события пронумерованы.
Дескрипторы описывают программы обработки прерывания.
Дескрипторы аппаратно (процессорно) зависимы.
ЦП должен сохранять тот контекст, который нельзя сохранить другими средствами. Если работаем с виртуальной памятью, надо аппаратно сохранять тот контекст, который меняется автоматически аппаратно во время перехода (таблица страниц, стек и т.д.).
Чтобы выполнить процедуру аппаратного прерывания достаточно сказать о факте происхождения события и передать номер сообщения (сигнализация и передача номера).
Система прерываний – специальный набор действий (какой номер выставлять на шину, что делать, если несколько и т.д.).
Ножка запроса прерываний всегда опрашивается центральным процессором между выполнением машинных инструкций.
Аппаратно в ЦП можно блокировать опрос этого бита (CLI).
Если этот бит устанавливается в 1, начинается обработка прерываний:
1) ЦП должен спасти свой контекст.
2) ЦП должен получить номер дескриптора таблицы (для этого сгенерировать цикл шины – подтверждение прерывания).
Контроллер прерываний – программируемое через СШ устройство.
Необходимо указать контроллеру, какой номер события связан с каким ВУ.
Система прерываний радиального типа: каждое прерывание ассоциирует с каждым устройством специальный единичный запрос.
Для каждой линии IRQx – одно событие. Устройства подключаются к таким линиям.
Приоритет предоставления прерываний – алгоритм, по которому контроллер прерываний определяет приоритеты ВУ, подключаемых к одной линии IRQx (?).
В MS-DOS и Windows используется линейная приоритетная схема: устройства имеют статические приоритеты, которые определяются номером линии IRQx.
Возможны и другие алгоритмы.
Например, циклическая схема: после завершения обработки прерываний устройство становится самым низкоприоритетным.
Наивысший приоритет предоставляется асинхронным устройствам, а также системным событиям. Низший – синхронным устройствам.
Главный недостаток – ограничено число линий запроса, а следовательно и устройств.
Можно построить иерархическую схему (расширяем вторым контроллером):
Третий контроллер подключить нельзя, т.к. не хватит линий прерываний. Шина тоже может накладывать ограничение на число прерываний (ISA – 15).
Если количество устройств очень большое, нельзя использовать эту схему!
Чтобы не потерять короткие прерывания используется маска запомненных прерываний.
EndofInterrupt – команда сброса масок блокировок и запомненных прерываний.
Нужно отправить ее контроллеру!
Нужно, чтобы на одну линию можно было подключить сколько угодно устройств – в этом случае нельзя использовать контроллер!
Производится программная или аппаратная привязка.
Устройство выставляет номер вектора на шину.
Но в цикле прерывания только одно устройство должно выставлять номер на шину.
Для этого вводится сигнал ответа устройству данного приоритета. ЦП должен иметь столько линий подтверждения прерываний, сколько у него линий запроса.
ACK должен попасть только к одному устройству данного приоритета!
Устройства с одинаковым приоритетом имеют «внутренний приоритет», определяемый их близостью к ЦП.
В этой схеме есть проблема, связанная с блокировкой запросов (в прошлой схеме проблем не было, блокировкой занимался контроллер).
С запросами связывается битовая маска, которая транслируется в слово состояния процессора. Т.е. ответственность за блокировку/разрешение прерываний возлагается на программиста (системного, конечно ;) )!
intx: pushax
push si
push ds