Введение
Семейство компьютерных контроллеров прерываний
В вычислительной технике, Advanced Programmable Interrupt Controller (APIC) компании Intel — это семейство программируемых контроллеров прерываний. Как следует из названия, APIC является более продвинутым, чем Programmable Interrupt Controller (PIC) 8259 компании Intel, особенно в плане возможности создания многопроцессорных систем. Это одна из нескольких архитектурных разработок, предназначенных для решения проблем эффективности маршрутизации прерываний в многопроцессорных компьютерных системах. APIC имеет разделяемую архитектуру, с локальным компонентом (LAPIC), обычно интегрированным непосредственно в процессор, и дополнительным I/O APIC на системной шине. Первым APIC был чип 82489DX — дискретная микросхема, выполнявшая функции как локального, так и I/O APIC. 82489DX позволил создавать системы с симметричной многопроцессорностью (SMP) на базе процессоров Intel 486 и ранних Pentium; например, в эталонной двухпроцессорной системе 486 SMP использовалось три чипа 82489DX: два в качестве локальных APIC и один — в качестве I/O APIC. Начиная с процессора P54C, функциональность локального APIC была интегрирована непосредственно в кремний процессоров Intel. Первым специализированным I/O APIC стал Intel 82093AA, предназначенный для систем на основе PIIX3.
In computing, Intel's Advanced Programmable Interrupt Controller (APIC) is a family of programmable interrupt controllers. As its name suggests, the APIC is more advanced than Intel's 8259 Programmable Interrupt Controller (PIC), particularly enabling the construction of multiprocessor systems. It is one of several architectural designs intended to solve interrupt routing efficiency issues in multiprocessor computer systems. The APIC is a split architecture design, with a local component (LAPIC) usually integrated into the processor itself, and an optional I/O APIC on a system bus. The first APIC was the 82489DX it was a discrete chip that functioned both as local and I/O APIC. The 82489DX enabled construction of symmetric multiprocessor (SMP) systems with the Intel 486 and early Pentium processors; for example, the reference two way 486 SMP system used three 82489DX chips, two as local APICs and one as I/O APIC. Starting with the P54C processor, the local APIC functionality was integrated into the Intel processors' silicon. The first dedicated I/O APIC was the Intel 82093AA, which was intended for PIIX3 based systems.
Обзор
В системе 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. В системах, содержащих ПИК 8259, этот ПИК может быть подключен к LAPIC в загрузочном процессоре системы (BSP), к одному из I/O APIC системы или к обоим. Однако логически 8259 подключается только один раз в любой момент времени.
I/O APIC
Вводно-выводные контроллеры APIC содержат таблицу перенаправления, которая используется для маршрутизации прерываний, получаемых от периферийных шин, к одному или нескольким локальным APIC. Ранние I/O APIC (например, 82489DX, SIO. A и PCEB/ESC) поддерживали только 16 линий прерываний, но более поздние, такие как 82093AA (отдельный чип для PIIX3/PIIX4), поддерживали 24 линии прерываний. Он поставлялся в корпусе PQFP с 64 выводами. 82093AA обычно подключался к PIIX3/PIIX4 и использовал встроенные в него устаревшие PIC 8259.
Варианты
xAPIC был представлен с Pentium 4, а x2APIC является самым современным поколением программируемого контроллера прерываний Intel, представленным с микроархитектурой Nehalem в ноябре 2008 года. Основные улучшения x2APIC касаются количества поддерживаемых процессоров и производительности интерфейса. x2APIC теперь использует 32 бита для адресации процессоров, что позволяет адресовать до 2<sup>32</sup> − 1 процессоров при использовании физического режима назначения. Логический режим назначения теперь работает иначе и вводит понятие кластеров; при использовании этого режима можно адресовать до 2<sup>20</sup> − 16 процессоров. Улучшенный интерфейс снижает количество необходимых обращений к регистрам APIC для отправки межпроцессорных прерываний (IPI). Благодаря этому преимуществу KVM может и эмулирует x2APIC для более старых процессоров, которые не поддерживают его аппаратно, и эта поддержка реализована в QEMU начиная с Conroe и даже для процессоров AMD Opteron G серии (ни один из которых не поддерживает x2APIC аппаратно). APICv – это фирменное название Intel для аппаратной поддержки виртуализации, направленной на снижение накладных расходов на прерывания в гостевых системах. APICv был представлен в серии процессоров Ivy Bridge EP, которые продаются как Xeon E5 26xx v2 (выпущены в конце 2013 года) и Xeon E5 46xx v2 (выпущены в начале 2014 года). AMD анонсировала аналогичную технологию под названием AVIC, она доступна в процессорах семейства 15h моделей 6Xh (Carrizo) и более новых.
Проблемы
Существует ряд известных ошибок в реализациях систем APIC, особенно в отношении подключения 8254. Неисправные BIOS могут некорректно настраивать маршрутизацию прерываний или предоставлять неверные таблицы ACPI и таблицы спецификации Intel MultiProcessor Specification (MPS). APIC также может быть причиной сбоя системы, если операционная система не обеспечивает его надлежащую поддержку. На более старых операционных системах часто требовалось отключать контроллеры ввода/вывода и локальные APIC. Хотя это больше невозможно из-за широкого распространения симметричных многопроцессорных и многоядерных систем, ошибки в прошивке и операционных системах сейчас встречаются редко.
Соревнование
AMD и Cyrix когда-то предложили архитектуру OpenPIC, схожую по назначению, поддерживающую до 32 процессоров; около 1995 года она получила хотя бы декларативную поддержку от IBM и Compaq. Однако ни одна материнская плата x86 не была выпущена с OpenPIC. После провала OpenPIC на рынке x86, AMD лицензировала APIC от Intel для своих процессоров AMD Athlon и последующих моделей. IBM же разработала свой контроллер прерываний для многопроцессорных систем (MPIC) на основе спецификаций регистров OpenPIC. MPIC использовался в конструкциях на базе PowerPC, включая системы IBM, например, некоторые RS/6000, а также Apple, вплоть до их Power Mac G5.