граммы обнаруживает ошибку, но не может обработать ее самостоятельно.
Так, система генерирует исключение в ответ на ошибки доступа к памяти
и ошибки типа деления на ноль. Однако не все исключения порождаются оши-
бочными ситуациями. Windows генерирует специальное исключение для вызо-
ва определенного системного сервиса. При обработке этого исключения ядро
передает управление той части операционной системы, которая предоставляет
запрашиваемый сервис.
Получив сигнал прерывания, перехватчик сначала сохраняет информацию
о текущем состоянии компьютера, с тем чтобы его можно было восстановить
после обработки сигнала. Затем он определяет, является поступивший сигнал
прерыванием, вызовом системного сервиса или исключением,
и в зависимости от полученного результата переадресовывает его диспетчеру
прерываний, системных сервисов или исключений соответственно. Указанные
вспомогательные диспетчеры находят нужную процедуру обработки и пере-
дают ей управление.
Windows назначает каждому прерыванию определенный приоритет [2].
Приоритет, присвоенный прерыванию, называется уровнем запроса прерыва-
ния (interrupt request level, IRQL). IRQL назначается источнику прерывания.
Например, мышь имеет IRQL, который присваивается поступающим от нее
сигналам. Системный таймер также генерирует собственные прерывания, ко-
торым назначается другой IRQL.
Центральный процессор также имеет свой IRQL, который изменяется по
мере работы системы. Изменение IRQL центрального процессора позволяет
системе блокировать прерывания с более низким приоритетом. Приоритет
процессора могут изменить только системные сервисы, работающие на уровне
ядра (например, перехватчик). Потоки, функционирующие на пользователь-
ском уровне, не имеют таких привилегий. Заблокированным прерываниям
внимание не уделяется до тех пор, пока какой-нибудь поток явным образом не
понизит уровень прерывания центрального процессора. Если процессор рабо-
тает при самом низком значении IRQL, происходит нормальное выполнение
потока и разрешается обработка всех прерываний. Когда перехватчик вызыва-
ет процедуру обслуживания прерывания (interrupt service routine, ISR), он сна-
чала назначает центральному процессору тот же IRQL, который имеет пере-
хваченный сигнал. На время выполнения ISR прерывания более низкого
уровня (например, сигналы от устройств ввода данных) блокируются, чтобы
не отвлекать систему от выполнения критических операций, таких как проце-
дуры восстановления при отключении питания. При понижении IRQL процес-
сора заблокированные прерывания разблокируются и начинают поочередно
обрабатываться обычным образом. Время от времени центральный процессор
переключается на самый низкий IRQL, чтобы возобновить выполнение пре-
рванных потоков.
Прежде чем приступить к обработке прерывания, перехватчик должен
найти в системе соответствующую подпрограмму. Он ищет такие подпро-
граммы в таблице распределения прерываний (interrupt dispatch table, IDT).
106