Программирование драйверов Windows


Обработка прерываний


В момент, когда сигнал прерывания достигает центрального процессора, процессор производит сравнение значение IRQL полученного запроса на прерывание со значением текущего IRQL процессора. В случае если новое значение IRQL меньше или равно старому, запрос на прерывание временно игнорируется и остается в состоянии ожидания до тех пор, пока значение IRQL процессора не понизится. В том случае, если уровень IRQL поступившего запроса превышает текущее значение IRQL процессора, последний выполняет следующие действия:

  • Приостанавливает выполнение текущей последовательности процессорных команд.
  • Сохраняет информацию о состоянии своей работы в стеке для того, чтобы возобновить работу отложенного программного потока позже.
  • Повышает значение IRQL процессора до значения IRQL поступившего запроса, предотвращая вмешательство в работу прерываний с более низкими уровнями IRQL.
  • Передает управление надлежащей сервисной процедуре обслуживания прерывания (ISR).

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

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




Начало  Назад  Вперед