Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Шины.PCI,.USB.и.FireWire

.pdf
Скачиваний:
60
Добавлен:
19.03.2016
Размер:
6 Mб
Скачать

Таблица 3.1. Аппаратные прерывания (в порядке убывания приоритета)

Имя (номер1)

Вектор2

Вектор3

Контрол

Описание

 

 

 

лер/маска

 

 

 

 

 

 

NMI

02h

 

 

Контроль канала, четность памяти

 

 

 

 

(в XT — сопроцессор)

IRQ0

08h

50h

#1/1h

Таймер (канал 0 8253/8254)

IRQ1

09h

51h

#1/2h

Клавиатура

IRQ2

0Ah

52h

#1/4h

XT — резерв, AT — недоступно

 

 

 

 

(подключается каскад IRQ8–IRQ15)

IRQ8

70h

58h

#2/1h

CMOS RTC — часы реального

 

 

 

 

времени

IRQ9

71h

59h

#2/2h

Резерв

IRQ10

72h

5Ah

#2/4h

Резерв

IRQ11

73h

5Bh

#2/8h

Резерв

IRQ12

74h

5Ch

#2/10h

PS/2 Mouse (резерв)

IRQ13

75h

5Dh

#2/20h

Математический сопроцессор

IRQ14

76h

5Eh

#2/40h

HDC — контроллер НЖМД

IRQ15

77h

5Fh

#2/80h

Резерв

IRQ3

0Bh

52h

#1/4h

COM2, COM4

IRQ4

0Ch

53h

#1/10h

COM1, COM3

IRQ5

0Dh

54h

#1/20h

XT — HDC, AT — LPT2, Sound

 

 

 

 

(резерв)

IRQ6

0Eh

55h

#1/40h

FDC — контроллер НГМД

IRQ7

0Fh

56h

#1/80h

LPT1 — принтер

 

 

 

 

 

1 Запросы прерываний 0, 1, 8 и 13 на шины расширения не выводятся. 2 Указаны номера векторов при работе в реальном режиме процессора. 3 Указаны номера векторов при работе в ОС Windows.

Каждому устройству, для поддержки работы которого требуются прерывания, дол$ жен быть назначен свой номер прерывания. Назначения номеров прерываний выполняются с двух сторон: во$первых, адаптер, нуждающийся в прерываниях, дол$ жен быть сконфигурирован на использование конкретной линии шины (джампе$ рами или программно). Во$вторых, программное обеспечение, поддерживающее данный адаптер, должно быть проинформировано о номере используемого векто$ ра. В процессе назначения прерываний может участвовать система PnP для шин ISA и PCI, для распределения линий запросов между шинами служат специаль$ ные параметры CMOS Setup. Современные ОС имеют возможность изменить на$ значение запросов относительно распределения, сделанного через CMOS Setup.

После того как произведено конфигурирование системы прерываний (проинициа$ лизирован контроллер прерываний, устройствам назначены линии запросов

и установлены указатели на процедуры обработки), отработка маскируемых аппа$ ратных прерываний происходит следующим образом:

устройство по событию прерывания возбуждает назначенную ему линию запроса прерывания;

контроллер принимает сигналы запросов от источников прерываний (сигналы

IRQx) и при наличии незамаскированного запроса подает сигнал общего запроса прерывания (сигнал INTR) процессору x86;

процессор, реагируя на запрос (когда прерывания флагом IF разрешены), со$ храняет в стеке содержимое регистра флагов и адрес возврата, после чего фор$ мирует шинный цикл INTA (Interrupt Acknowledge, подтверждение прерывания), который доводится до контроллера прерываний;

в момент получения сигнала INTA контроллер прерываний фиксирует состоя$ ние своих входов запросов — к этому моменту их состояние могло измениться: могли появиться новые запросы или пропасть запрос от «нетерпеливого» уст$ ройства. Контроллер анализирует поступившие запросы в соответствии с зап$ рограммированной схемой приоритетов и посылает процессору вектор прерыва ния, соответствующий самому приоритетному незамаскированному запросу, присутствующему на входе контроллера в момент подачи шинной команды INTA. При этом контроллер выполняет и некоторые действия в соответствии с установленной приоритетной политикой, учитывающие, какой именно вектор был послан (какой из запросов пошел на обслуживание);

получив вектор прерывания, процессор по его номеру вызывает соответствую$ щую процедуру обработки прерывания. Если данный вектор прерывания ис$ пользуется не только для аппаратных прерываний, но и для исключений и/или программных прерываний, то процедура в первую очередь должна определить, к какому из этих типов относится данное событие. Для этого процедура может обратиться к контроллеру PIC (прочитать регистр ISR) и проанализировать состояние регистров процессора. Дальнейшие шаги рассматриваются для слу$ чая, когда обнаружено аппаратное прерывание;

процедура обработки прерывания должна идентифицировать источник преры$ вания — определить устройство, его вызвавшее. В случае разделяемого исполь$ зования несколькими устройствами данного номера запроса (следовательно, и вектора) идентифицировать источник прерывания можно только последова$ тельными обращениями к регистрам каждого из этих устройств. При этом сле$ дует учитывать возможность поступления запросов от нескольких устройств од$ новременно или в процессе обработки прерывания от одного из них;

процедура должна обслужить устройство$источник прерывания — выполнить «полезные» действия, связанные с событием, о котором и сигнализировало ус$ тройство. Это обслуживание должно обеспечить и снятие сигнала запроса пре рывания от данного устройства. В случае разделяемых прерываний источников может быть и несколько, и все они требуют обслуживания;

если обработка прерывания занимает значительное время, в течение которого требуется реакция системы на более приоритетные запросы, то после критиче$

ской секции в обработчик включают инструкцию STI, устанавливающую флаг разрешения прерываний (IF) в процессоре. С этого момента возможны вложен ные прерывания, прерывающие работу данного обработчика другой, более прио$ ритетной процедурой;

процедура обработки прерывания должна послать контроллеру команду завер шения обработки прерывания EOI (End Of Interrupt), по которой контроллер разрешит последующий прием сигнала с обслуженного входа и менее приори$ тетных. Это должно быть сделано после снятия сигнала прерывания от обслу$ женных устройств, иначе контроллер после EOI пошлет повторный запрос. Обработчик прерывания, для которого запрос поступил от ведомого контрол$ лера, должен послать EOI как ведомому, так и ведущему контроллеру. Участок обработчика, начинающийся от подачи команды EOI до завершения (инструк$ ции IRET), должен быть непрерываемым, то есть он является критической сек цией. Если обработчик разрешал вложенные прерывания, то перед подачей ко$ манды EOI должна присутствовать инструкция CLI, запрещающая прерывания;

завершается обработка прерывания инструкцией IRET, по которой процессор возвращается к выполнению прерванного потока инструкций, предварительно извлекая из стека содержимое регистра флагов. При этом аппаратные прерыва$ ния снова окажутся разрешенными.

Эта последовательность описана применительно к обычному контроллеру преры$ ваний (PIC), в системах с APIC меняется способ доставки вектора прерывания от контроллера к процессору, а в прерываниях MSI меняется способ доставки сиг$ нала от устройства к контроллеру APIC. Эти нюансы описаны в последующих разделах.

Традиционный контроллер прерываний — PIC

Контроллер прерываний (PIC) 8259A является периферийным устройством, ко$ торое связано с процессором через системную шину. По этой шине процессор мо$ жет обращаться к регистрам контроллера, программируя его режимы и управляя им, а также получать от контроллера 8$битный вектор прерывания, для чего в ин$ терфейсе системной шины процессора имеется специальная команда подтвержде$ ния прерывания (INTA). Контроллер 8259A имеет 8 входов запросов от источни$ ков и один выход общего запроса. Каждому из входов соответствует свой вектор; программированием регистров контроллера задается номер вектора для входа 0, остальным входам соответствуют последующие номера векторов. Каждый вход может быть программно замаскирован — тогда он не будет вызывать сигнал обще$ го запроса. Контроллер занимает два адреса в пространстве ввода/вывода, про$ граммное обращение по этим адресам обеспечивает выполнение следующих функций:

управление режимами работы контроллера;

управление приоритетами и масками запросов;

идентификацию запросов прерывания без вырабатывания общего запроса — обслуживание прерываний по опросу (полинг).

В контроллере имеется три регистра: IRR, IMR и ISR. С каждым входом запроса в контроллере связано по одному биту каждого из этих регистров; бит 0 каждого из этих регистров относится к входу 0, бит 1 — к входу 1, бит 7 — ко входу 7. Реги$ стры имеют следующие назначения:

IRR (Interrupt Request Register) — регистр запросов прерываний, в котором бит устанавливается при обнаружении сигнала прерывания на соответствующем входе, независимо от маски;

IMR (Interrupt Mask Register) — регистр масок прерываний. Единичное значе$ ние бита означает замаскированность данного входа — по запросу с замаскиро$ ванного входа общий запрос прерывания не генерируется;

ISR (Interrupt Service Register) — регистр обслуживаемого прерывания. Во вре$ мя цикла подтверждения (INTA) в регистре устанавливается бит, соответству$ ющий наиболее приоритетному запросу и, соответственно, формируемому век$ тору прерывания. В этот же момент обнуляется соответствующий бит запроса в регистре IRR. Бит в ISR обнуляется по получении контроллером команды EOI, а в режиме автоматического подтверждения (по команде AEOI) он обнуляется сразу после передачи вектора прерывания.

Контроллер прерываний позволяет программировать свои входы на чувствитель$ ность к уровню или перепаду сигнала:

чувствительность к уровню (level sensitive) означает, что контроллер прерыва$ ний вырабатывает запрос прерывания процессора по факту обнаружения опре$ деленного уровня на входе IRQx. Если к моменту завершения обработки этого запроса (после записи команды EOI в регистр контроллера прерываний) кон$ троллер снова обнаруживает активный уровень на том же входе DRQx, то он сно$ ва сформирует запрос на прерывание процессора;

чувствительность к перепаду (edge sensitive) означает, что контроллер преры$ ваний вырабатывает запрос прерывания процессора только по факту обнару$ жения перепада (на ISA — положительного) на входе IRQx. Повторно запрос по этому входу возможен только по следующему такому же перепаду, то есть сиг$ нал предварительно должен вернуться в исходное состояние.

В любом случае сигнал запроса аппаратного прерывания IRQx должен удерживать$ ся генерирующей его схемой, по крайней мере, до цикла подтверждения прерыва$ ния процессором — именно в этот момент PIC определяет самый приоритетный незамаскированный запрос и по нему формирует вектор. Если к этому моменту запрос будет снят, источник прерывания корректно идентифицирован не будет

иконтроллер сообщит ложный вектор прерывания (spurious interrupt), соответ$ ствующий его входу с максимальным номером (IRQ7 для первого контроллера

иIRQ15 для второго). Обычно периферийные устройства строят так, что сигнал запроса сбрасывается при обращении программы обслуживания прерывания к соот$ ветствующим регистрам адаптера, так что ложных прерываний возникать не должно.

Стандартный PIC позволяет управлять чувствительностью только для всех вхо$ дов одновременно. В шине ISA и системной периферии (таймеры, контроллер кла$ виатуры) прерывание сигнализируется положительным перепадом сигнала на

линии запроса, так что традиционно контроллеры PIC программируют на чувстви$ тельность к перепаду. Более поздние модификации PIC, применяемые в системах с шиной EISA и ISA с поддержкой PnP, а также новые контроллеры APIC при работе в PIC$совместимом режиме позволяют управлять чувствительностью для каждого входа индивидуально.

Один PIC 8259A позволяет обслуживать 8 запросов прерываний; в PC/AT приме$ няется каскадное соединение двух контроллеров, один из которых является веду$ щим, другой — ведомым. Ведущий контроллер 8259A#1 обслуживает запросы 0, 1, 3–7; его выход подключается к входу запроса прерываний процессора. К его входу 2 подключен ведомый контроллер 8259A#2, который обслуживает запросы 8–15. При этом поддерживается вложенность приоритетов — запросы 8–15 со своим рядом убывающих приоритетов вклиниваются между запросами 1 и 3 ведущего контрол$ лера, приоритеты запросов которого также убывают с ростом номера. В XT каска$ дирование не применялось и один контроллер 8259A обслуживал все 8 линий за$ просов.

Контроллер 8259A позволяет работать с запросами в различных режимах:

Fully Nested Mode — режим полной вложенности приоритетов; каждому входу (уровню) запросов назначается свой приоритет (самый приоритетный — вход 0). В момент подтверждения прерывания контроллер устанавливает в регистре ISR бит, соответствующий самому приоритетному запросу на данный момент (и пе$ реданному вектору прерывания), и до его сброса игнорирует последующие за$ просы с данного входа и менее приоритетные запросы;

Special Fully Nested Mode — специальный режим полной вложенности, исполь$ зуемый в ведущем контроллере при каскадном соединении. В этом режиме ве$ дущий контроллер не блокирует запрос от входа, к которому подключен ведо$ мый контроллер. Это позволяет ведомому контроллеру сигнализировать о запросе, более приоритетном, чем предыдущий. В конце процедуры обработ$ ки ведомому контроллеру посылается неспецифический EOI, после чего считы$ вается его ISR. Если в ISR ни один бит не установлен, то неспецифический EOI посылается и ведущему контроллеру, что позволит ему обслуживать и менее приоритетные входы. Если же в ISR ведомого контроллера есть ненулевые биты, то ведущий контроллер снова подаст общий запрос прерывания, и на его под$ тверждение ведомый пошлет соответствующий вектор. Упоминаний о провер$ ке на 0 значения ISR вторичного контроллера до подачи EOI первичному при$ менительно к PC автору не встречалось. Очевидно, что в ней нет необходимости, если не используется ротация приоритетов: если у вторичного контроллера есть еще не обслуженные запросы, то они будут обслужены в соответствии со своим приоритетом (до IRQ3…IRQ7);

Automatic Rotation Mode — режим автоматической ротации приоритетов позво$ ляет организовать равноприоритетное обслуживание всех запросов. В этом ре$ жиме уровень, запрос от которого пошел на обслуживание, получает низший приоритет. Ротация приоритетов организуется подачей команд OCW2 с кодом операции 101 или 100 (см. далее);

Specific Rotation Mode — режим специфицированной ротации: командой OCW2 с кодом операции 111 или 110 указанному уровню устанавливается низший приоритет;

Poll Mode — режим опроса, в котором общий запрос INTR не вырабатывается. По команде Poll, посылаемой через OCW3, контроллер фиксирует самый проритет$ ный запрос. Последующее считывание из регистра контроллера даст байт, в ко$ тором бит 7 указывает на наличие запроса, а в битах [2:0] содержится номер самого приоритетного запроса;

Normal EOI — нормальный режим завершения, в котором бит ISR сбрасывается явной командой EOI, посылаемой контроллеру в конце исполнения обработчи$ ка прерывания. Обычно используется команда неспецифического EOI (код 20h), по которой сбрасывается бит ISR, соответствующий самому приоритетному из обслуживаемых запросов. Возможна команда и специфического EOI, которая сбрасывает в ISR бит, указанный в данной команде. Бит для замаскированного запроса таким способом сброшен быть не может;

Auto EOI — автоматическая генерация неспецифического EOI контроллером в конце цикла подтверждения прерывания. Этот режим применим лишь в слу$ чаях, когда не требуется поддержка вложенности прерываний, и только для ве$ дущего контроллера.

Контроллер 8259A своими 8$битными регистрами приписывается к пространству ввода/вывода и занимает 2 смежных адреса. Обмен с регистрами контроллеров должен производиться только однобайтными операциями ввода/вывода. В совре$ менных PC$совместимых компьютерах контроллеры имеют и дополнительные регистры (ELCR). Положение регистров в пространстве ввода/вывода приведено в табл. 3.2.

Таблица 3.2. Регистры контроллеров прерываний

Адрес

 

Назначение

Тип

8259A#1

8259A#2

 

 

 

 

 

 

020h

0A0h

Подача команд ICW1, OCW2, OCW3

WO

 

 

Чтение регистров IRR, ISR или данных

RO

 

 

полинга (в зависимости от OCW3)

 

021h

0A1h

Подача команд ICW2, ICW3, ICW4, OCW1

WO

 

 

Обращение к регистру IMR

RW

4D0h

4D1h

Обращение к регистру ELCR

RW

 

 

 

 

Контроллер имеет два режима работы: режим инициализации и операционный. После сброса контроллер инициализируется последовательностью команд ICW1ICW4 (Initialization Command Words) длиной до 4 байт, после чего переходит в операционный режим. В операционном режиме (Operation Mode)контроллер вос$ принимает команды управления OCW1OCW3 (Operation Control Words). В опе$ рационном режиме он может быть и реинициализирован, признаком начала ини$

циализации является единичное значение бита 4 в байте, записываемом по адресу 020h (0A0h). Назначение команд и регистров контроллера прерываний приведено ниже

Команда инициализации ICW1 (запись по адресу 020h или 0A0h) служит для кон$ фигурирования контроллера:

биты [7:5]: 0 (в PC не используются);

бит 4:1 — признак команды инициализации (в командах управления он нуле$ вой);

бит 3 — чувствительность линий запроса: 0 — прерывание по перепаду, 1 — преры$ вание по уровню. В современных контроллерах игнорируется, в них используется отдельный регистр ELCR, управляющий чувствительностью каждого из входов;

бит 2 = 0 (в PC не используется);

бит 1:0 — каскадное включение пары контроллеров, 1 — одиночный контрол$ лер;

бит 0:1 — признак использования ICW4.

Команда инициализации ICW2 (запись по адресу 021h или 0A1h) задает номер век$ тора, генерируемого данным контроллером для входа 0. Биты [2:0] должны иметь нулевые значения.

Команда инициализации ICW3 (запись по адресу 021h или 0A1h) используется толь$ ко для каскадного включения:

для ведущего контроллера (Master, 8259A#1) биты [0:7] указывают на наличие ведомых контроллеров на линиях IRQ0–IRQ7 соответственно. В AT ICW3 = 04h (ведомый на IRQ2);

для ведомого контроллера (Slave, 8259A#2) биты [2:0] содержат номер входа ведущего контроллера, к которому он подключен, биты [7:3] сброшены. В AT ICW3 = 02h (подключен к IRQ2 ведущего).

Команда инициализации ICW4 (запись по адресу 021h или 0A1h) задает режим ра$ боты контроллера, его применение обязательно при начальной инициализации:

биты [7:5]: 0 — не используются;

бит 4 — SFNM (Special Fully Nested Mode): 1 — специальный режим полной вло$ женности разрешен, 0 — запрещен;

бит 3 — BUF (Buffered): 1 — признак буферизованности шины;

бит 2 — M/S (Master/Slave), положение в каскаде: 1 — ведущий, 0 — ведомый. В современных контроллерах не используется (сброшен);

бит 1 — AEOI (Auto End Of Interrupt): 1 — разрешение автоматического завер$ шения прерывания, 0 — нормальный режим (требует подачи EOI);

бит 0 — тип используемого процессора: 1 — 8086/8088 и далее, 0 — 8080.

Команда управления OCW1 (запись по адресу 021h или 0A1h) задает маски запро$ сов, единичное значение бита означает маскирование запроса. Биты [0:7]опреде$ ляют маски запросов для IRQ0–IRQ7 (8259#1) или IRQ8–IRQ15 (8259#2).

Команда управления OCW2 (запись по адресу 020h или 0A0h) — завершение об$ служивания прерывания (команда EOI), управление приоритетом:

биты [7:5] задают код операции (в операциях, помеченных звездочкой, исполь$ зуется поле LLL в битах 2–0):

001 — неспецифический EOI;

011* специфический EOI для запроса LLL;

101 — неспецифический EOI с ротацией приоритета;

100 — установка ротации приоритета в режиме AEOI;

000 — сброс ротации приоритета в режиме AEOI;

111* специфический EOI с ротацией приоритета (установкой низшего прио$ ритета для заданного уровня);

110* — установка низшего приоритета для заданного уровня;

010 — нет операции.

биты [4:3]: 00 — признак OCW2;

биты [2:0] — поле LLL — номер уровня, к которому относится команда (только для команд, помеченных звездочкой).

Команда управления OCW3 (запись по адресу 020h или 0A0h) — оперативное уп$ равление контроллером:

бит 7:0 — не используется;

биты [6:5] — режим специального маскирования (в PC не используется): 11 — установить, 10 — сбросить, 00, 01 — не изменять;

биты [4:3]: 01 — признак OCW3;

бит 2 — признак команды опроса (полинга). После команды полинга на после$ дующую команду чтения порта 020h или 0A0h контроллер ответит байтом, ко$ дирующим запрос прерывания с максимальным приоритетом. Для PC полинг обычно не используется (бит 2 — нулевой), а контроллер передает вектор пре$ рывания по команде INTA;

биты [1:0] — управление чтением регистров при операциях ввода по адресу 020h или 0A0h:

10 — чтение IRR — регистра запросов;

11 — чтение ISR — регистра обслуживаемого прерывания;

00, 01 — не изменять выбор регистра.

Регистры ELCR, имеющиеся в современных компьютерах, позволяют селективно управлять чувствительностью входов. В этих регистрах каждый бит отвечает за режим своего входа запроса: 0 — чувствительность к положительному перепаду, 1 — чувствительность к высокому уровню. Для входов IRQ0, 1, 2, 8 и 13 (таймер, клавиатура, вторичный контроллер прерываний, часы и исключение сопроцессо$ ра), допускается чувствительность только к перепаду (соответствующие биты должны быть нулевыми, но чипсет может их и игнорировать). Линии запросов прерывания от PCI по пути ко входам инвертируются, так как на них запрос сиг$ нализируется низким уровнем.

В IBM PC/XT/AT используется специальный режим вложенных прерываний с фиксированным приоритетом и автоматическим неспецифическим завершени$ ем; типовые байты инициализации и управления приведены в табл. 3.3. После ини$ циализации (процедурой POST и при загрузке ОС) все неиспользуемые входы контроллеров замаскированы (на запросы прерываний реагировать не будут), а их векторы прерываний указывают на «заглушку» — процедуру с единственной ин$ струкцией IRET. Для подключения обработчика прерывания от устройства пер$ вым делом следует загрузить обработчик в память и установить указатель на него

втаблице прерываний. Далее следует размаскировать соответствующий ему вход

вконтроллере прерываний, для чего выполняется чтение регистра маски (адрес 21h для 8259A#1, A1h для 8259A#2), обнуление соответствующего бита (см. табл. 3.1) и запись в регистр нового значения маски. Если обработчик прерывания удаляет$ ся из памяти, предварительно должен быть замаскирован соответствующий ему вход контроллера. Все изменения в таблице прерываний должны выполняться при замаскированных прерываниях, чтобы избежать попытки использования вектора

впроцессе его модификации (это приведет к «вылету» программы — вызову по некорректному адресу).

Каждая процедура обработки аппаратного прерывания должна завершаться ко$ мандой неспецифического EOI — посылкой OCW2 = 20h контроллеру:

для запросов от ведущего контроллера — посылка байта 20h по адресу 20h;

для запросов от ведомого контроллера — посылка байта 20h по адресу A0h (EOI для ведомого контроллера); затем посылка байта 20h по адресу 20h (EOI для ведущего контроллера).

Некорректно завершенная процедура не позволит повторно использовать данный или другие запросы прерываний. Заметим, что команды EOI, как и инструкция IRET, в современных ОС включены в общий обработчик прерывания. В приклад$ ных обработчиках (в драйверах устройств) этих команд быть не должно, иначе ОС не сможет собрать цепочку обработчиков разделяемого прерывания. В среде MS$ DOS команды EOI и инструкцию IRET должен подавать прикладной обработчик.

Таблица 3.3. Байты инициализации контроллеров прерываний

Байт

8259A#1

8259A#2

ICW1

10h

10h

ICW2

08h

70h

ICW3

04h

02h

ICW4

1Fh

1Bh

OCW3

0Ah

0Ah

 

 

 

На современных системных платах функции контроллеров прерываний возлага$ ются на чипсет, который может иметь и более гибкие возможности управления, чем пара контроллеров 8259A. Процедура инициализации контроллеров может и отличаться от традиционной, но ею занимается тест POST, который «знает» осо$

бенности системной платы. Однако в операционном режиме всегда сохраняется программная совместимость с 8259A.

«Продвинутый» контроллер прерываний — APIC

Контроллер APIC в первую очередь предназначен для симметричных мультипро$ цесорных систем (SMP), описанных в документе Intel «MultiProcessor Specifica$ tion» (MPS), в Сети доступна версия 1.4, 1997 год. Здесь симметрия рассматрива$ ется в двух аспектах:

симметрия памяти — все процессоры пользуются общей памятью, работают с одной копией ОС;

симметрия ввода/вывода — все процессоры разделяют общие устройства вво$ да/вывода и общие контроллеры прерываний.

Система может быть симметричной по памяти, но асимметричной по прерывани$ ям от ввода/вывода, если для них используется выделенный процессор. В x86 сим$ метрию по прерываниям обеспечивает 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. В специфкации MPS определено три режима обработки прерываний:

режим PIC (PIC Mode) — эмуляция пары PIC 8259A с традиционной передачей сигналов прерывания одному процессору (загрузочному, BSP Bootstrap Pro$ cessor) по линиям INTR и NMI;