Поскольку архитектура x64 совместима с операционными системами x86, системы x64 должны предоставлять такие же контроллеры прерываний, что и системы x86. Но существенная разница состоит в том, что x64-версии не будут запускаться на системах, которые не имеют APIC, поскольку для управления прерываниями они используют APIC.
Содержание:
Контроллеры прерываний IA64
Архитектура IA64 зависит от модернизированного усовершенствованного программируемого контроллера StreamlinedAdvancedProgrammableInterrupt Controller (SAPIC), который является результатом развития контроллера APIC.
Даже если во встроенной программе присутствует балансировка и маршрутизация, Windows ими не пользуется, вместо этого она назначает прерывания процессорам статически, по кругу.
Эксперимент: просмотр PIC и APIC
Конфигурацию PIC на однопроцессорной системе и текущего локального APIC на мультипроцессорной системе можно просмотреть соответственно с помощью команд отладчика ядра !pic и !apic. Вывод команды !pic на однопроцессорной системе имеет следующий вид.
(Следует учесть, что команда !pic в системе, использующей APIC HAL, не работает.)
lkd> !pic
----- IRQ Number ----- 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
Physically in service: . . . . . . . . . . . . . . . .
Physically masked: . . . Y . . Y Y . . Y . . Y . .
Physically requested: . . . . . . . . . . . . . . . .
Level Triggered: . . . . . Y . . . Y . Y . . . .
Далее следует вывод команды !apic, запущенной на системе, использующей APIC HAL. Учтите, что при локальной отладке ядра эта команда показывает APIC, связанный с текущим процессором, — иначе говоря, с тем процессором, на котором был запущен поток отладчика при вводе команды. При просмотре аварийного дампа или удаленной системы для переключения на тот процессор, чей локальный APIC нужно просмотреть, можно использовать команду ~ (тильда) с указанием после нее номера процессора.
lkd> !apic
Apic @ fffe0000 ID:0 (50014) LogDesc:01000000 DestFmt:ffffffff TPR 20
TimeCnt: 00000000clk SpurVec:3f FaultVec:e3 error:0
Ipi Cmd: 01000000'0000002f Vec:2F FixedDel Ph:01000000 edg high
Timer..: 00000000'000300fd Vec:FD FixedDel Dest=Self edg high m
Linti0.: 00000000'0001003f Vec:3F FixedDel Dest=Self edg high m
Linti1.: 00000000'000004ff Vec:FF NMI Dest=Self edg high
TMR: 51-52, 62, A3, B1, B3
IRR:
ISR::
Различные числа, следующие за метками Vec, показывают вектор в IDT, связанный с заданной командой. Например, в данном выводе прерывание номер 0xFD связано с APIC Timer, а прерывание номер 0xE3 управляет ошибками APIC. Поскольку этот эксперимент был запущен на той же самой машине, что и ранее проводившийся эксперимент !idt, можно заметить, что 0xFD является прерыванием профилирования HAL (которое использует таймер для профилирования интервалов), а 0xe3, как и ожидалось, является обработчиком ошибок локального APIC HAL.
Следующий вывод является результатом выполнения команды !ioapic, показывающей конфигурацию APIC-контроллеров ввода-вывода, компонентов контроллера прерываний, подключенного к устройствам:
lkd> !ioapic
IoApic @ FEC00000 ID:0 (51) Arb:A951
Inti00.: 0000a951'0000a951 Vec:51 LowestDl Lg:0000a951 lvl low