The mechanism of interruptions of a code stream on the part of a hardware (Механизм прерываний кодового потока со стороны аппаратной часть компьютера), страница 3

Итак, для иллюстрации всего механизма, произведём небольшой мысленный эксперимент - пользователь компьютера нажал клавишу на клавиатуре. Проследим цепочку превращений этого события из физической формы в логическую, а далее - формализованную программную.

Что происходит при нажатии какой-либо клавиши? Цепь, ключом которой эта клавиша является, замыкается, и на входе специальной микросхемы, находящейся в корпусе клавиатуры, которым заканчивается данная цепь, появляется потенциал, соответствующий логической единице. Эта микросхема в общем плане называется контролёром и является программируемым устройством (микро-ЭВМ в цельном исполнении). В соответствии со своей программой протокола обмена информацией с принимающим устройством - портом компьютера, к которому присоединена эта клавиатура, он отсылает пакет байт в порт. Порт тоже является контролёрным устройством, а то, что мы видим на задней панели компьютера - всего лишь его разъём. Принимающий контроллёр получает этот пакет байт и декодирует уже в пакет другого протокола. Данный контроллёр является дочерним устройством той шины, к которой он присоединён.

Контроллёр порта преобразует  поступивший пакет протокола конкретного порта в пакет протокола конкретной шины, которой данный порт обслуживается. Далее этот пакет попадает на контроллёр арбитра шины.

Контроллёр шины устанавливает сигнал логической единицы на входе специального устройства-посредника между запросами устройств на обработку событий, с ними происходящих, и процессором - PIC-микросхемой (Programmable Interrupt Controller). Это тоже контроллёр.

Принципиальная схема аппаратного сервиса прерываний.

При поступлении сигнала на контроллёр он проверит эту линию в своей внутренней таблице маскирования на предмет такового относительно данного входа. Если линия отмечена в таблице, как маскируемая, то контроллёр никак не отреагирует, и сигнал будет по-прежнему присутствовать на линии прерывания, ожидая своей обработки до того момента, пока в таблице не измениться состояние диспетчеризации этой линии, как немаскируемой.

Допустим, что прерывание клавиатуры в данный момент не маскируется. Тогда контроллёр выдаёт контроллёру порта ответный сигнал - IRQA (Interrupt Request Acknowledgement). В последствии контроллёр снимает запрос с линии прерывания и продолжает ожидание обработки события в несигнальном режиме. Контроллёр также подаёт сигнал на один из входов процессора на обработку прерывания. Следует отметить, что этот процесс происходит при непосредственном аппаратном взаимодействии PIC и центрального процессора. Далее процессор запрашивает у PIC, на какую именно линию поступило прерывание.

Отсюда начинается стадия обработки, специфичная для конкретной операционной системы. Ранее оговаривалось, что речь пойдёт о платформе Windows NT. Итак, процессор x86 находит в специальной системной структуре, поддерживаемой аппаратно, и находящейся в памяти, - таблице IDT (Interrupt Descriptors Table), запись с дескриптором данного прерывания. Этот дескриптор - обычное битовое поле, в котором, помимо всего прочего, находится адрес специальной программы, являющейся полем системной структуры, создаваемой при загрузке системы и инициализации устройств - объекта прерывания.

В объекте прерывания находится небольшая ассемблерная подпрограмма, которая производит вызов истинного диспетчера прерываний.

Данная стадия не контролируется системой и для этого применяется объект прерывания, который вызывает, собственно диспетчер с необходимыми параметрами.

Также в объекте находится адрес ISR драйвера, IRQL прерывания и вспомогательная информация (спин-блокировка и т.д.).

Ассемблерная процедура в объекте прерывания применяется одна и та же и копируется из специального системного шаблона во время загрузки. Это ухищрение Windows позволяет ей «взять инициативу» выполнения кода «в свои руки».