Маскируемые прерывания используются для сигнализации о событиях в устройствах. Реакция процессора на маскируемые прерывания может быть задержана сбросом его внутреннего флага IF (инструкция CLI запрещает прерывания, STI — разрешает). По возникновении события, требующего реакции, адаптер (контроллер) устройства формирует запрос прерывания, который поступает на вход контроллера прерываний. Задача контроллера прерываний — довести до процессора запрос прерывания и сообщить вектор, по которому выбирается программная процедура обработки прерываний. В IBM PC-совместимых компьютерах применяется два основных типа контроллеров прерываний:
♦ Периферийный контроллер прерываний (Peripheral Interrupt Controller, PIC) программно совместим с традиционным контроллером 8259А, использовав шимся еще в первых моделях IBM PC. Co времен IBM PC/AT применяется связка из пары каскадно соединенных контроллеров PIC, позволяющая об служивать до 15 линий запросов прерываний.
♦ Усовершенствованный периферийный контроллер прерываний (Advanced Pe ripheral Interrupt Controller, APIC) введен в компьютеры для поддержки мультипроцессорных систем на базе процессоров 4-5-го поколений (486 и Pen tium) и используется поныне для более поздних моделей процессоров. По мимо поддержки мультипроцессорных конфигураций, современный кон троллер APIC позволяет увеличивать число доступных линий прерываний и обрабатывать запросы прерываний от устройств PCI, посылаемые через механизм сообщений (MSI). Компьютер, рснащенный контроллером APIC, обязательно имеет возможность функционировать и в режиме, совместимом со стандартной связкой пары PIC. Этот режим включается по аппаратному сбросу (и включению питания), что позволяет использовать старые ОС и приложения MS-DOS, «не знающие» APIC и мультипроцессирования.
Традиционная схема формирования запросов прерываний с использованием пары контроллеров PIC изображена на рис. 4.4.
На входы контроллеров прерываний поступают запросы от стандартных устройств (клавиатура, системный таймер, CMOS-таймер, сопроцессор), периферийных контроллеров системной платы и от карт расширения. Традиционно все линии запросов, не занятые перечисленными устройствами, присутствуют на всех слотах шины ISA/EISA. Эти линии обозначаются как IRQx и имеют общепринятое назначение (см. далее). Часть этих линий отдается в распоряжение шины PCI.
Традиционные (не РпР) устройства ISA используют запрос по положительному перепаду сигнала IRQx, что делает невозможным их совместное (разделяемое) применение несколькими устройствами. Устройства ISA, поддерживающие механизм РпР, позволяют настраиваться на прерывание по низкому уровню сигнала; устройства PCI работают только по низкому уровню. Это дает возможность задействовать линии запросов в режиме разделения, что порождает определенные проблемы (см. далее). Линии IRQx, используемые шиной PCI, становятся недоступными для шины ISA. «Дележку» линий между шинами, а также управление чувствительностью (к перепаду или уровню) отдельных линий обеспечивают параметры CMOS Setup, а также механизм РпР. В параметрах CMOS Setup название «ISA» или «Legacy» подразумевает использование линий IRQx традиционными адаптерами шины ISA (статическое распределение), а название «PCI/PnP» — адаптерами шины PCI или адаптерами РпР для шины ISA (динамическое распределение).Для запросов прерывания с шины PCI (см. 14.5) задействуют 4 линии запросов прерывания, которые обозначают как INTR А, В, С, D.Эти линии работают по низкому уровню, что дает возможность их совместного (разделяемого) использования. Линии циклически сдвигаются в слотах и независимо коммутируются на доступные линии IRQxс помощью конфигурационных регистров чипсета.
В табл. 4.2 запросы расположены в порядке убывания приоритета. Номера векторов, соответствующих линиям запросов контроллеров, система приоритетов и некоторые другие параметры задаются программно при инициализации контроллеров PIC или APIC. Эти основные настройки остаются традиционными для совместимости с программным обеспечением, но различаются для ОС реального и защищенного режимов. Так, например, в ОС Windows базовые векторы для ведущего и ведомого контроллеров — 50h и 58h соответственно.
Каждому устройству, для поддержки работы которого требуются прерывания, должен быть назначен свой номер прерывания. Назначения номеров прерываний выполняются с двух сторон: во-первых, адаптер, нуждающийся в прерываниях, должен быть сконфигурирован на использование конкретной линии шины (джамперами или программно); во-вторых, программное обеспечение, поддерживающее данный адаптер, должно быть проинформировано о номере применяемого вектора. В процессе назначения прерываний может участвовать система РпР для шин ISA и PCI; для распределения линий запросов между шинами служат специальные параметры CMOS Setup. Современные ОС имеют возможность изменить назначение запросов относительно распределения, сделанного через CMOS Setup.
После того как конфигурирование системы прерываний произведено (проини-циализирован контроллер прерываний, устройствам назначены линии запросов и установлены указатели на процедуры обработки), отработка маскируемых аппаратных прерываний происходит следующим образом:
1. Устройство по событию прерывания возбуждает назначенную ему линию запроса прерывания.
2. Контроллер принимает сигналы запросов от источников прерываний (сигна лы IRQx) и при наличии незамаскированного запроса подает сигнал общего запроса прерывания (сигнал INTR) процессору х86.
3. Процессор, реагируя на запрос (когда прерывания флагом IF разрешены), сохраняет в стеке содержимое регистра флагов и адрес возврата, после чего формирует шинный цикл INTA (Interrupt Acknowledge — подтверждение пре рывания), который доводится до контроллера прерываний.
4. В момент получения сигнала INTA контроллер прерываний фиксирует со стояние своих входов запросов — к этому моменту их состояние могло изме ниться: например, появились новые запросы или пропал запрос от «нетер пеливого» устройства. Контроллер анализирует поступившие запросы в соот ветствии с запрограммированной схемой приоритетов и посылает процессо ру вектор прерывания, соответствующий самому приоритетному незамаскиро ванному запросу, присутствующему на входе контроллера в момент подачи шинной команды INTA. При этом контроллер выполняет и некоторые действия в соответствии с установленной приоритетной политикой, учитывающие, ка кой именно вектор был послан (какой из запросов пошел на обслуживание).
5. Получив вектор прерывания, процессор по его номеру вызывает соответ ствующую процедуру обработки прерывания. Если данный вектор прерыва ния используется не только для аппаратных прерываний, но и для исключе ний и/или программных прерываний, то процедура в первую очередь должна определить, к какому из этих типов относится данное событие. Для этого процедура может обратиться к контроллеру PIC (прочитать регистр ISR) и проанализировать состояние регистров процессора.
Дальнейшие шаги описывают случай аппаратного прерывания.
6._________________________________________________________________ Процедура обработки прерывания идентифицирует источник прерывания — определяет устройство, его вызвавшее. При разделяемом использовании не сколькими устройствами данного номера запроса (следовательно, и вектора) идентифицировать источник прерывания можно только последовательными обращениями к регистрам каждого из этих устройств. При этом следует учитывать возможность поступления запросов от нескольких устройств одновременно или в процессе обработки прерывания от одного из них.
7. Процедура обслуживает устройство-источник прерывания — выполняет «по лезные» действия, связанные с событием, о котором и сигнализировало устройство. Это обслуживание должно обеспечить и снятие сигнала за проса прерывания от данного устройства. В случае разделяемых прерыва ний источников может быть несколько, и все они требуют обслуживания.
Если обработка прерывания занимает значительное время, в течение которого требуется реакция системы на более приоритетные запросы, то после критической секции в обработчик включают инструкцию STI, устанавливающую флаг разрешения прерываний (IF) в процессоре. С этого момента возможны вложенные прерывания, прерывающие работу данного обработчика при поступлении другого, более приоритетного прерывания.
8. Процедура обработки прерывания посылает контроллеру команду EOI (End Of Interrupt — завершение обработки прерывания), по которой контроллер разрешает последующий прием сигнала с обслуженного входа и менее при оритетных. Это должно быть сделано после снятия сигнала прерывания от обслуженных устройств, иначе контроллер после EOI пошлет повторный за прос. Обработчик прерывания, для которого запрос поступил от ведомого контроллера, должен послать EOI как ведомому, так и ведущему контролле ру. Фрагмент обработчика от инструкции подачи команды EOI до заверше ния (инструкции IRET) должен быть непрерываемым, то есть являться кри тической секцией. Если обработчик разрешал вложенные прерывания, то перед инструкцией подачей команды EOI должна присутствовать инструкция CLI, запрещающая прерывания.
9. Завершается обработка прерывания инструкцией IRET, по которой процессор возвращается к выполнению прерванного Потока инструкций, предваритель но извлекая из стека содержимое регистра флагов (с установленным IF), и аппа ратные прерывания снова оказываются разрешенными.
Эта последовательность описана применительно к обычному контроллеру прерываний (PIC), в системах с APIC меняется способ доставки вектора прерывания от контроллера к процессору, а в прерываниях MSI меняется способ доставки сигнала от устройства к контроллеру APIC. Эти нюансы описаны в последующих разделах.