Итак, для иллюстрации всего механизма, произведём небольшой мысленный эксперимент - пользователь компьютера нажал клавишу на клавиатуре. Проследим цепочку превращений этого события из физической формы в логическую, а далее - формализованную программную.
Что происходит при нажатии какой-либо клавиши? Цепь, ключом которой эта клавиша является, замыкается, и на входе специальной микросхемы, находящейся в корпусе клавиатуры, которым заканчивается данная цепь, появляется потенциал, соответствующий логической единице. Эта микросхема в общем плане называется контролёром и является программируемым устройством (микро-ЭВМ в цельном исполнении). В соответствии со своей программой протокола обмена информацией с принимающим устройством - портом компьютера, к которому присоединена эта клавиатура, он отсылает пакет байт в порт. Порт тоже является контролёрным устройством, а то, что мы видим на задней панели компьютера - всего лишь его разъём. Принимающий контроллёр получает этот пакет байт и декодирует уже в пакет другого протокола. Данный контроллёр является дочерним устройством той шины, к которой он присоединён.
Контроллёр порта преобразует поступивший пакет протокола конкретного порта в пакет протокола конкретной шины, которой данный порт обслуживается. Далее этот пакет попадает на контроллёр арбитра шины.
Контроллёр шины устанавливает сигнал логической единицы на входе специального устройства-посредника между запросами устройств на обработку событий, с ними происходящих, и процессором - PIC-микросхемой (Programmable Interrupt Controller). Это тоже контроллёр.
Принципиальная схема аппаратного сервиса прерываний.
При поступлении сигнала на контроллёр он проверит эту линию в своей внутренней таблице маскирования на предмет такового относительно данного входа. Если линия отмечена в таблице, как маскируемая, то контроллёр никак не отреагирует, и сигнал будет по-прежнему присутствовать на линии прерывания, ожидая своей обработки до того момента, пока в таблице не измениться состояние диспетчеризации этой линии, как немаскируемой.
Допустим, что прерывание клавиатуры в данный момент не маскируется. Тогда контроллёр выдаёт контроллёру порта ответный сигнал - IRQA (Interrupt Request Acknowledgement). В последствии контроллёр снимает запрос с линии прерывания и продолжает ожидание обработки события в несигнальном режиме. Контроллёр также подаёт сигнал на один из входов процессора на обработку прерывания. Следует отметить, что этот процесс происходит при непосредственном аппаратном взаимодействии PIC и центрального процессора. Далее процессор запрашивает у PIC, на какую именно линию поступило прерывание.
Отсюда начинается стадия обработки, специфичная для конкретной операционной системы. Ранее оговаривалось, что речь пойдёт о платформе Windows NT. Итак, процессор x86 находит в специальной системной структуре, поддерживаемой аппаратно, и находящейся в памяти, - таблице IDT (Interrupt Descriptors Table), запись с дескриптором данного прерывания. Этот дескриптор - обычное битовое поле, в котором, помимо всего прочего, находится адрес специальной программы, являющейся полем системной структуры, создаваемой при загрузке системы и инициализации устройств - объекта прерывания.
В объекте прерывания находится небольшая ассемблерная подпрограмма, которая производит вызов истинного диспетчера прерываний.
Данная стадия не контролируется системой и для этого применяется объект прерывания, который вызывает, собственно диспетчер с необходимыми параметрами.
Также в объекте находится адрес ISR драйвера, IRQL прерывания и вспомогательная информация (спин-блокировка и т.д.).
Ассемблерная процедура в объекте прерывания применяется одна и та же и копируется из специального системного шаблона во время загрузки. Это ухищрение Windows позволяет ей «взять инициативу» выполнения кода «в свои руки».
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.