Отображение прерываний на IRQL-уровни
IRQL-уровни нельзя отождествлять с запросами на прерывание (IRQ), определенными контроллерами прерываний, — в архитектурах, на которых работает Windows, концепция IRQL на аппаратном уровне не реализована.
Как же тогда Windows определяет, какой IRQL следует назначить прерыванию? Ответ можно найти в HAL. В Windows присутствие устройств на шине (PCI, USB и т. д.) и прерываний, которые могут быть назначены этим устройствам, определяется таким типом драйвера устройства, который называется драйвером шины.
Драйвер шины сообщает эту информацию диспетчеру устройств Plug and Play, который, с учетом допустимых назначения прерываний для всех остальных устройств, решает, какое прерывание будет назначено каждому устройству. Затем им вызывается арбитр прерываний Plug and Play, который отображает прерывания на IRQL-уровни. (На системах, не имеющих ACPI, используется корневой арбитр, а на ACPI-совместимых системах ACPI HAL имеет свой собственный арбитр.)
Для разных HAL, включенных в Windows, используются разные алгоритмы назначения. На ACPI-системах (включая x86, x64 и IA64), HAL вычисляет IRQL для заданного прерывания путем деления вектора прерывания, назначенного IRQ на 16. Что же касается выбора вектора прерывания для IRQ, это зависит от типа контроллера прерывания, имеющегося в системе.
На современных APIC-системах это число генерируется в циклическом режиме, поэтому какого-либо способа вычислить IRQ на основе вектора прерывания или IRQL не существует.
Но в следующем эксперименте будет показано, как отладчик может запросить эту информацию у арбитра прерываний.