Контроллер APIC в первую очередь предназначен для симметричных мульти-процесорных систем (см. 7.5), в которых все процессоры разделяют общие устройства ввода-вывода и общие контроллеры прерываний. Однако APIC используется и в однопроцессорных системных платах. Система с APIC состоит из локальных контроллеров, установленных в процессорах, и контроллеров прерываний от ввода-вывода (одного или нескольких). Все контроллеры APIC соединены между собой локальной шиной, по которой они обмениваются друг с другом сообщениями. Задача каждого локального контроллера (local APIC) — трансляция сообщений, принятых по локальной шине, в сигналы, вызывающие все аппаратные прерывания своего процессора, — маскируемые (INTR), немаскируемые (NMI) и системного управления (SMI). Кроме того, локальные контроллеры APIC позволяют каждому процессору генерировать прерывания для других процессоров. Локальный контроллер имеет внутренний интервальный таймер, позволяющий вырабатывать прерывания через программируемый интервал времени. Контроллер прерываний от ввода-вывода (I/O APIC) преобразует запросы аппаратных прерываний от устройств в сообщения протокола локальной шины APIC. В мультипроцессорном режиме он отвечает за распределение прерываний по процессорам, для чего может потребоваться статическое или динамическое распределение. В случае статического распределения для каждого номера прерывания указывается номер процессора, который его обслуживает. В случае динамического распределения каждое прерывание направляется наименее приоритетному в данный момент процессору. Этот же контроллер отвечает за распространение сигналов о системных событиях (NMI, INIT, SMI) и межпроцессорных прерываний. Прерывания в мультипроцессорных системах подробно рассмотрены в документе «Intel Architecture Software Developer's Manual Volume 3: System Programming Guide», доступном на сайте http://www. intel.com. Здесь же ограничимся описаниями возможностей, предоставляемых контроллерами APIC для сигнализации прерываний ввода-вывода.
Контроллер I/O APIC является частью чипсета системной платы, например, он входит в хабы ICH2 и ICH3 чипсетов Intel. Доступны три режима обработки прерываний:
♦ режим PIC (PIC mode) — эмуляция пары PIC 8259A с традиционной переда чей сигналов прерывания одному загрузочному процессору (Bootstrap Pro cessor, BSP) по линиям INTR и NMI;
♦ режим виртуальных проводов (virtual wire mode) — то же, но с подачей сиг налов прерывания по локальной шине APIC, при этом контроллер I/O APIC может работать совместно с PIC 8259A, обеспечивая дополнительные воз можности (в частности, дополнительные входы запросов прерываний);
♦ симметричный режим ввода-вывода (symmetric I/O mode) — сообщения пре рывания от устройств генерирует APIC; прерывания могут доставляться лю бому процессору; каждый вход запроса индивидуально программируется с помощью таблицы перенаправления прерываний ввода-вывода (I/O redirec tion table).
Первые два режима обеспечивают полную совместимость с системой прерываний PC/AT, с программной точки зрения они эквивалентны, различия лежат в области схемотехники. При аппаратном сбросе (и включении питания) система начинает работать в одном из этих режимов. Когда система подготовится к переходу в мультипроцессорный режим (МР), APIC переводится в симметричный режим и активизирует таблицу перенаправления прерываний (предварительно программно инициализированную).
Для симметричных систем допустимы векторы в диапазоне 10h-FEh. Уровень приоритета прерывания определяется номером его вектора, деленным на 16. Самый приоритетный уровень — нулевой.
Контроллер I/O APIC позволяет вырабатывать значительное число запросов прерываний; каждому запросу соответствует свой элемент в таблице перенаправления, находящейся в APIC. Каждый элемент определяет способ реакции на свой запрос, вектор прерывания и процессор (процессоры) назначения, который должен его обработать. С запросами связаны индивидуальные входы INTINn; определенный уровень или перепад сигнала на этих входах вызывают соответствующие запросы. Чувствительность и вектор (а следовательно, и приоритет) для каждого запроса программируются индивидуально. Более совершенные модели I/O APIC позволяют вызывать прерывание записью номера входа в регистр контроллера, что, например, используется для поддержки прерываний MSI на шине PCI. При этом возможна и экономия сигнальных входов: APIC может иметь входы INTINn не для всех номеров запросов, вырабатываемых записью в этот регистр. Однако число запросов всегда ограничивается размером таблицы перенаправления.
Регистры контроллеров APIC отображаются на пространство памяти. Все локальные контроллеры APIC используют один и тот же диапазон адресов (по умолчанию базовый адрес — FEEO OOOOh) — к их регистрам обращаются только программы, исполняемые на их же процессорах, и эти обращения не выводятся на системную шину. Контроллеры I/O APIC доступны всем процессорам, по умолчанию базовый адрес первого I/O APIC — FECO OOOOh, базовые адреса остальных контроллеров (если таковые имеются) назначаются последовательно с шагом lOOOh.
Выделение для сообщений APIC отдельной локальной шины позволяет освободить системную шину процессора от трафика, связанного с обслуживанием прерываний (подачи подтверждений прерываний для получения вектора). В современных процессорах используется локальная шина, состоящая из трех сигнальных линий: PICD[1:O] — двунаправленная шина данных и PICCLK — сигнал синхронизации (тактовая частота). Протокол шины обеспечивает распределенный механизм арбитража и надежную доставку сообщений. Сообщения, передаваемые по локальной шине APIC, программно невидимы; реализация и протокол шины могут быть изменены производителями процессоров и чипсетов системных плат, но это не отразится на ПО.
Помимо использования последовательной локальной шины, есть и иной вариант доставки сообщений к локальным контроллерам APIC — в этом варианте происходят обращения к пространству памяти. Для этого локальные контроллеры APIC настраиваются на отслеживание операций записи по определенным адресам. Источник сообщений выполняет операцию записи в пространство памяти, в которой и адрес, и данные несут информацию о событии прерывания. В качестве источника сообщений может выступать расширенный контроллер, называемый 1/0(х)АР1С. Вышеупомянутый хаб ICH3 имеет возможность работы в режиме 1/О(х)АР1С.