Прерывания. Клавиатурное прерывание.
Прерывание (англ. interrupt) — сигнал, сообщающий процессору о наступлении какого-либо события. При этом выполнение текущей последовательности команд приостанавливается, и управление передаётся обработчику прерывания, который реагирует на событие и обслуживает его, после чего возвращает управление в прерванный код.
Использование прерываний при работе с медленными внешними устройствами позволяют совместить ввод/вывод с обработкой данных в центральном процессоре и в результате повышает общую производительность системы. Некоторые прерывания (первые пять в порядке номеров) зарезервированы для использования самим центральным процессором на случай каких-либо особых событий вроде попытки деления на ноль, переполнения и т. п.
Причины:
1. События, происходящие в периферийных устройствах (внешн)
2. Программное прерывание – вызов супервизора (внутр)
3. Неопределенные события в процессах. (внутр)
4. Действия оператора. (внешн)
5. Прерывания по таймеру. (внешн)
Каждой конкретной причине прерывания назначен номер от 0 до 255. Некоторые номера прерываний уже назначены аппаратно процессором, другие присваиваются аппаратной системой, в которую встроен процессор. (Например, прерывания дискового накопителя). Еще одни зарезервированы для дальнейшего расширения, а все остальные могут использоваться программами. Когда возникает прерывание, процессор использует номер прерывания, как индекс в таблице. Из таблицы извлекается адрес обработки прерывания. Обработчик вызывается для производства конкретной обработки, требуемой прерыванием. Похоже, как будто в программе в точке прерывания вставлена команда вызова.
Запись процедуры прерывания должна быть такой, чтобы прерванная программа продолжалась так, как будто ничего не произошло. Необходимо запоминать и восстанавливать PSW и регистры, используемые процедурой прерывания, и возврат должен происходить к команде, следующей за командой, выполненной до прерывания.
В зависимости от источника возникновения сигнала прерывания делятся на:
· асинхронные, или внешние (аппаратные) — события, которые исходят от внешних источников (например, периферийных устройств) и могут произойти в любой произвольный момент: сигнал от таймера, сетевой карты или дискового накопителя, нажатие клавиш клавиатуры, движение мыши, кончилась бумага в принтере. Во всех этих случаях требуется прервать выполнение текущей программы и перейти на выполнение другой программы (подпрограммы), обслуживающей данное событие. Факт возникновения в системе такого прерывания трактуется как запрос на прерывание (англ. Interrupt request, IRQ);
· синхронные, или внутренние — события в самом процессоре как результат нарушения каких-то условий при исполнении машинного кода: деление на ноль, появление несуществующего кода команды, обращение программы в область памяти, для нее не предназначенную, сбой при выполнении передачи данных или операции в АЛУ и многое другое;
· программные (частный случай внутреннего прерывания) — инициируются исполнением специальной инструкции в коде программы. Программные прерывания как правило используются для обращения к функциям встроенного программного обеспечения (firmware), драйверов и операционной системы.
Все прерывания устройства подключаются к контроллеру прерываний, а контроллер к процессору. Прерывания от некоторых периферийных устройств более срочные и важные, чем другие. Если прерывания от двух устройств возникают одновременно, то контроллер передает в процессор прерывание с более высоким приоритетом, а второе запоминает. Только процессор завершает обработку первого прерывания, контроллер сообщает ему о втором. Контроллер прерываний узнает о том, что прерывание обработалось, по специальной команде: OUT – код конца прерывания выводит в порт, подключенный к контроллеру. Эта команда записывается в конце процедуры прерывания.
Организация прерываний должна быть обеспечена определенными аппаратными и программными средствами, которые называют подсистемой прерываний.
Подсистема прерываний должна обеспечивать выполнение следующих функций:
· обнаружение изменения состояния внешней среды (запрос на прерывание);
· идентификация источника прерывания;
· приоритет запросов - разрешение конфликтной ситуации в случае одновременного возникновения нескольких запросов;
· приоритет программ - определение возможности прерывания текущей программы;
· фиксация состояния прерываемой (текущей) программы;
· обработка прерываний - переход к программе, соответствующей обслуживаемому прерыванию;
· возврат к прерванной программе после окончания работы прерывающей программы.
Такие прерывания возникают, как правило, случайно и асинхронно по отношению к программе и требуют прекращения (чаще временного) выполнения текущей программы и переход на выполнение другой программы (подпрограммы), соответствующей возникшему событию.
Обслуживание прерываний могут взять на себя BIOS карт расширений (например, сетевых или видеокарт), операционная система и даже обычные (прикладные) программы, которые постоянно находятся в памяти во время работы других программ (т. н. резидентные программы).
Таблица векторов прерываний. Клавиатурное прерывание
Для того чтобы связать адрес обработчика прерывания с номером прерывания, используется таблица векторов прерываний, занимающая первый килобайт оперативной памяти - адреса от 0000:0000 до 0000:03FF. Таблица состоит из 256 элементов -FAR-адресов обработчиков прерываний. Эти элементы называются векторами прерываний. В первом слове элемента таблицы записано смещение, а во втором - адрес сегмента обработчика прерывания. Прерыванию с номером 0 соответствует адрес 0000:0000, прерыванию с номером 1 - 0000:0004 и т. д.
(Домашнее задание – найти и записать в тетрадь таблицу векторов прерываний; ссылка http://emanual.ru/download/8237.html)
Клавиатура подключена к линии прерывания IRQ1. Этой линии соответствует прерывание INT 09h.
Клавиатурное прерывание обслуживается модулями BIOS. Как работает стандартный обработчик клавиатурного прерывания, входящий в состав BIOS?
Этот обработчик выполняет следующие действия:
- читает из порта 60h скан-код нажатой клавиши;
- записывает вычисленное по скан-коду значение ASCII-кода нажатой клавиши в специальный буфер клавиатуры, расположенный в области данных BIOS;
- устанавливает в 1 бит 7 порта 61h, разрешая дальнейшую работу клавиатуры;
- возвращает этот бит в исходное состояние;
- записывает в порт 20h значение 20h для правильного завершения обработки аппаратного прерывания.
Обработчик прерывания INT 09h не просто записывает значение ASCII-кода в буфер клавиатуры. Дополнительно отслеживаются нажатия таких комбинаций клавиш, как Ctrl-Alt-Del, обрабатываются специальные клавиши PrtSc и SysReq. При вычислении кода ASCII нажатой клавиши учитывается состояние клавиш Shift и CapsLock. Буфер клавиатуры имеет длину 32 байта.
Дата добавления: 2021-01-11; просмотров: 456;