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


Приоритеты выполнения программного кода


Поскольку разные процессорные архитектуры реализуют разные подходы к управлению аппаратурой при помощи прерываний, разделяемых по приоритетам, операционная система Windows NT использует идеализированную схему, которая удовлетворяет особенностям всех аппаратных платформ. Практическая сторона данной схемы состоит в использовании процедур слоя аппаратный абстракций HAL, которые и берут на себя специфические особенности аппаратуры, позволяя создавать платформенно-независимый драйверный код.

Основой этой схемы абстрактных приоритетов прерываний является IRQL (interrupt request level) &#8212 уровень запроса на прерывание. Уровень IRQL представляет собой число, определяющее приоритет. Программный код, выполняющийся на данном уровне IRQL, не может быть прерван программным кодом, имеющим равный или более низкий IRQL. В таблице 6.1 приводятся уровни IRQL, используемые в Windows 2000/XP/Server 2003. Именно так уровни IRQL видятся драйверу, независимо от того, на каком процессоре или в какой шинной архитектуре приходится драйверу работать. Важно также и то, что в любой конкретный момент времени каждая инструкция (оператор программного кода) выполняется на одном определенном уровне приоритета со специфическим значением IRQL. Уровень IRQL входит в состав контекста выполнения каждого потока, следовательно, в любой момент времени операционной системе достоверно известен его текущий уровень IRQL.

Таблица 6.1. Уровни IRQL

Генерируется Наименование Назначение
Аппаратным

обеспечением

HIGH_LEVEL

Проверка компьютера и шинные ошибки
POWER_LEVEL Прерывание по сбою в энергоснабжении
  IPI_LEVEL Прерывания межпроцессорного взаимодействия для многопроцессорных систем
  CLOCK_LEVEL Интервальный таймер
  PROFILE_LEVEL Таймер профилирования
  DIRQL Платформенно-зависимое число уровней для прерываний устройств ввода/вывода
Программным

обеспечением

DISPATCH_LEVEL Планирование потоков и выполнение отложенных процедурных вызовов (DPC)
  APC_LEVEL Выполнение асинхронных процедурных вызовов (1)
  PASSIVE_LEVEL Уровень нормального исполнения потоков (0)
<


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