В вычислительной технике усовершенствованный программируемый контроллер прерываний ( APIC ) компании Intel представляет собой семейство программируемых контроллеров прерываний . Как следует из названия, APIC более продвинут, чем программируемый контроллер прерываний (PIC) компании Intel 8259 , в частности, позволяя создавать многопроцессорные системы. Это один из нескольких архитектурных проектов, предназначенных для решения проблем эффективности маршрутизации прерываний в многопроцессорных компьютерных системах.
APIC представляет собой конструкцию с раздельной архитектурой, в которой локальный компонент (LAPIC) обычно интегрируется в сам процессор, а дополнительный APIC ввода-вывода на системной шине. Первым APIC был 82489DX — это был дискретный чип, который функционировал как локальный и APIC ввода-вывода. 82489DX позволял создавать симметричные многопроцессорные (SMP) системы с процессорами Intel 486 и ранними процессорами Pentium ; например, эталонная двухканальная система 486 SMP использовала три чипа 82489DX, два как локальные APIC и один как APIC ввода-вывода. Начиная с процессора P54C , локальная функциональность APIC была интегрирована в кремний процессоров Intel. Первым специализированным APIC ввода-вывода был Intel 82093AA, который был предназначен для систем на базе PIIX3 .
В системе Intel APIC есть два компонента: локальный APIC (LAPIC) и I/O APIC . В каждом ЦП системы есть один LAPIC. В самой первой реализации ( 82489DX ) LAPIC был дискретной схемой, в отличие от его более поздней реализации в кремнии процессоров Intel. Обычно для каждой периферийной шины в системе имеется один I/O APIC. В оригинальных конструкциях систем LAPIC и I/O APIC были соединены выделенной шиной APIC. Более новые системы используют системную шину для связи между всеми компонентами APIC.
Каждый APIC, будь то дискретный чип или интегрированный в ЦП, имеет регистр версии, содержащий четырехбитный номер версии для его конкретной реализации APIC. Например, 82489DX имеет номер версии APIC 0, в то время как версия 1 была назначена первому поколению локальных APIC, интегрированных в процессоры Pentium 90 и 100. [1]
В системах, содержащих 8259 PIC , 8259 может быть подключен к LAPIC в системном процессоре начальной загрузки (BSP), к одному из системных APIC ввода-вывода или к обоим. Однако логически 8259 подключается только один раз в любой момент времени.
Чип Intel APIC первого поколения, 82489DX, который предназначался для использования с процессорами Intel 80486 и ранними процессорами Pentium, на самом деле является внешним локальным и I/O APIC в одной схеме. Спецификация Intel MP 1.4 называет его «дискретным APIC» в отличие от «интегрированного APIC», который можно найти в большинстве процессоров Pentium. [2] У 82489DX было 16 линий прерываний; [3] у него также была особенность, заключающаяся в том, что он мог терять некоторые прерывания ISA. [4]
В многопроцессорной системе 486 каждый ЦП должен был быть сопряжен со своим собственным 82489DX; дополнительно дополнительный 82489DX должен был использоваться как I/O APIC. 82489DX не мог эмулировать 8259A (XT-PIC), поэтому их также приходилось включать в качестве физических чипов для обратной совместимости. [5] 82489DX был упакован как 132-контактный PQFP . [3]
Локальные APIC (LAPIC) управляют всеми внешними прерываниями для определенного процессора в системе SMP. Кроме того, они способны принимать и генерировать межпроцессорные прерывания (IPI) между LAPIC. Каждый LAPIC может поддерживать до 224 используемых векторов прерываний от APIC ввода-вывода. Номера векторов от 0 до 31 из 0 до 255 зарезервированы для обработки исключений процессорами x86.
Все процессоры Intel, начиная с микроархитектуры P5 ( P54C ), имеют встроенный локальный APIC. [6] [7] Однако, если локальный APIC отключен в процессоре P5, его нельзя включить повторно программным обеспечением; это ограничение больше не существует в процессорах P6 и более поздних. [7]
С появлением Pentium 4 HT и Pentium D каждое ядро ЦП и каждый поток ЦП имеют интегрированный LAPIC.
Функция прерываний, сигнализируемых сообщениями (MSI) спецификации PCI 2.2 и более поздних версий не может использоваться без включения локального APIC. [8] Использование MSI устраняет необходимость в APIC ввода-вывода. Кроме того, в режиме MSI поддерживается до 224 прерываний, а совместное использование IRQ не допускается. [9]
Еще одним преимуществом локального APIC является то, что он также обеспечивает таймер с высоким разрешением (порядка одной микросекунды или лучше), который может использоваться как в интервальном, так и в однократном режиме. [7]
У таймера APIC были свои первоначальные проблемы с принятием. В документе Microsoft от 2002 года (в котором предлагалось принять вместо него таймер событий высокой точности ) таймер LAPIC критиковался за «плохое разрешение» и утверждалось, что «часовой кремний иногда сильно глючит». [10] Тем не менее, таймер APIC используется, например, Windows 7 , когда включено профилирование , и Windows 8 при любых обстоятельствах. (До того, как Windows 8 заявила исключительные права на этот таймер, он также использовался некоторыми программами, такими как CPU-Z .) В Microsoft Windows таймер APIC не является общим ресурсом. [11]
Апериодические прерывания, предлагаемые таймером APIC, используются функцией ядра Linux tickless . Эта необязательная, но стандартная функция является новой с 2.6.18. При включении на компьютере с таймером APIC ядро не использует программируемый интервальный таймер 8253 для хронометража. [12] В документе VMware отмечается, что «программное обеспечение не имеет надежного способа определения его частоты. Как правило, единственный способ определить частоту локального таймера APIC — это измерить ее с помощью таймера PIT или CMOS, что дает лишь приблизительный результат». [13]
I/O APIC содержат таблицу перенаправления, которая используется для маршрутизации прерываний, которые он получает от периферийных шин, на один или несколько локальных APIC. Ранние I/O APIC (например, 82489DX, SIO.A и PCEB/ESC) поддерживали только 16 линий прерываний, но более поздние, такие как 82093AA (отдельный чип для PIIX3/PIIX4), поддерживали 24 линии прерываний. [9] Он был упакован как 64 - контактный PQFP . [14] 82093AA обычно подключался к PIIX3 / PIIX4 и использовал его интегрированные устаревшие 8259 PIC. [14] ICH1 интегрировал I/O APIC.
Согласно результатам теста Intel 2009 года с использованием Linux , I/O APIC сократил задержку прерывания почти в три раза по сравнению с эмуляцией 8259 (XT-PIC), в то время как использование MSI сократило задержку еще больше, почти в семь раз по сравнению с базовым уровнем XT-PIC. [15]
xAPIC был представлен в Pentium 4 , в то время как x2APIC является последним поколением программируемого контроллера прерываний Intel, представленным в микроархитектуре Nehalem в ноябре 2008 года. [ 16] Основные усовершенствования x2APIC касаются количества поддерживаемых процессоров и производительности интерфейса.
Теперь x2APIC использует 32 бита для адресации ЦП, что позволяет адресовать до 2 32 − 1 ЦП с использованием физического режима назначения. Логический режим назначения теперь работает по-другому и вводит кластеры; с помощью этого режима можно адресовать до 2 20 − 16 процессоров.
Улучшенный интерфейс уменьшает количество необходимых доступов к регистру APIC для отправки межпроцессорных прерываний (IPI). Благодаря этому преимуществу KVM может эмулировать x2APIC для старых процессоров, которые физически его не поддерживают, и эта поддержка предоставляется QEMU , начиная с Conroe и даже для процессоров AMD Opteron G-серии (ни один из которых изначально не поддерживает x2APIC). [17] [18]
APICv — это торговая марка Intel для поддержки аппаратной виртуализации , направленная на снижение накладных расходов на прерывания в гостевых системах. APICv был представлен в серии процессоров Ivy Bridge-EP , которая продается как Xeon E5-26xx v2 (выпущен в конце 2013 года) и как Xeon E5-46xx v2 (выпущен в начале 2014 года). [19] [20] AMD анонсировала похожую технологию под названием AVIC , [21] [22] она доступна в моделях семейства 15h, процессорах 6Xh (Carrizo) и более новых. [23]
Существует ряд известных ошибок в реализациях систем APIC, особенно касающихся способа подключения 8254. Неисправные BIOS могут неправильно настраивать маршрутизацию прерываний или предоставлять неверные таблицы ACPI и таблицы спецификации Intel MultiProcessor (MPS).
APIC также может быть причиной сбоя системы, когда операционная система не поддерживает его должным образом. В старых операционных системах ввод-вывод и локальные APIC часто приходилось отключать. Хотя это больше невозможно из-за распространенности симметричных многопроцессорных и многоядерных систем, ошибки в прошивке и операционных системах теперь встречаются редко.
AMD и Cyrix когда-то предложили несколько схожую по своему назначению архитектуру OpenPIC , поддерживающую до 32 процессоров; [24] она имела, по крайней мере, декларативную поддержку от IBM и Compaq примерно в 1995 году . [25] Однако ни одна материнская плата x86 не была выпущена с OpenPIC. [26] После провала OpenPIC на рынке x86 AMD лицензировала APIC Intel для своих процессоров AMD Athlon и более поздних.
Однако IBM разработала свой контроллер прерываний MultiProcessor Interrupt Controller (MPIC) на основе спецификаций регистра OpenPIC. [27] MPIC использовался в разработках на базе PowerPC , включая разработки IBM, например, в некоторых системах RS/6000 , [28] а также Apple, вплоть до Power Mac G5s . [29] [30]