Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ОС.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
194 Кб
Скачать
☆

Объекты прерывания

Ядро Windows предоставляет механизм, необходимый для манипуляции с прерываниями – «объекты прерывания» (Interrupt Objects). Эти объекты содержат всю необходимую информацию для ядра, которая позволяет назначать IRQL, определять адрес обработчика в IDT и выполнять другие манипуляции. В объект прерывания при его создании и инициализации включается также некоторый ассемблерный код, который выполняется в некоторых случаях, в т.ч. при возникновении прерывания. Его задача – вызвать диспетчер прерываний.

Процедура KillIterruptDispatch() (слайд 28). Код также передает указатель этой функции на объект прерывания. KillInterruptDispatch() обслуживает векторы прерываний, для которых зарегистрирован только один объект. Возможно построение нескольких объектов прерываний, которые используют разделяемые векторы, одинаковые. Объект прерывания также хранит само значение IRQL, сопоставленное с данным прерыванием, так что KernelInterruptDispatch может повысить и далее понизить его. Типичная схема обработки прерываний представлена на слайде 28.

Сопоставление конкретной ISR (Interrupt Routing) с конкретным уровнем прерывания называется в Windows «подключением объекта прерывания», а разрыв связи между ISR и уровнем – «отключением». Эти функции выполняются функциями ядра IOControlInterrupt и IODisconnectInterrupt.

Примечание: применение объекта прерывания позволяет драйверам устройств минимально взаимодействовать с контроллером прерываний непосредственно и детально знать состояние IDT. Объект прерывания позволяет также ядру синхронизировать выполнение ISR с другими частями драйвера. Возможно также вызывать несколько ISR для определенных уровней прерывания. Например, если несколько драйверов создают объекты прерывания, которые сопоставлены одной и той же записи в IDT, то при возникновении прерывания диспетчер в определенном порядке вызывает каждую из этих ISR.

Программные прерывания

Кроме прерываний, генерируемых аппаратурой, возможно также генерировать прерывания программно.

Это необходимо в следующих случаях:

1) диспетчеризация потоков;

2) обработка отложенных прерываний, т.е. обработка их некритична по времени;

3) обработка событий, связанных со службой времени (таймерами устройств), асинхронного выполнения процедуры (незапланированного) в контексте конкретного потока;

4) поддержка асинхронного ввода-вывода;

5) прерывания DPC (Differed Procedure Call).

Когда выполняющийся поток по какой-либо причине переходит в ждущее состояние, ядро обращается к диспетчеру, чтобы немедленно вызвать переключение контекста на другой поток. Но бывают случаи, когда перераспределение процессора займет последовательность вложенных процедур уровней кода, т.е. будет выполняться достаточно долго. Поэтому переключиться немедленно на другой контекст не представляется возможным. Переключение не выполняется и откладывается. Для этого запрашивается диспетчер процессов. Задержка подобного типа, связанная с переключением контекста, организуется Windows с помощью механизма DPC (отложенного вызова процедуры).

Обнаружив необходимость диспетчеризации, в этом случае ядро генерирует прерывание уровня DPC, но т.к. уже существуют процессы в системе с этим IRQL, обработка его откладывается. Когда очередь рассосалась, оно снижает IRQL ниже уровня DPC и проверяет, не ожидают ли выполнения отложенные прерывания диспетчеризации. Если ожидают, то они обрабатываются. Активация диспетчера – один из способов отложить диспетчеризацию до определенного момента.

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

DPC, как и прерывания, выполняются в ОС. DPC представляется DPC объектом – объект ядра, который не виден пользовательским приложением, но виден драйверам и исполнительной системе. Наиболее важная часть DPC объекта – адрес системной функции, которую ядро должно вызвать для обработки отложенного прерывания DPC. При этом все DPC процедуры, запланированные к выполнению (подобно процессам) хранятся в специальных очередях. Эти очереди называются очередями DPC. Идея: запрашивая DPC обработку, вызывается ядро, инициируется DPC объект, который становится в очередь DPC объектов, обработка всех DPC начинается тогда, когда IRQL процессора станет Passive.

Схема обработки DPC прерывания показана на слайде 30.

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

DPC также используется ядром в случае истечения кванта времени, выделенного какому-то процессу. В этом случае генерируется прерывание с уровнем Clock, создается новый квант времени, перераспределяется процессор для вызова переключения на новый контекст. Возможно через процесс Explorer провести мониторинг активности прерываний DPC.