Intel 8259 — это программируемый контроллер прерываний (PIC), разработанный для микропроцессоров Intel 8085 и 8086. Первоначальная часть называлась 8259, более поздняя версия с суффиксом A была совместима снизу вверх и могла использоваться с процессором 8086 или 8088. 8259 объединяет несколько источников входных прерываний в один выход прерывания для главного микропроцессора, расширяя уровни прерываний, доступные в системе, за пределы одного или двух уровней, имеющихся на чипе процессора. 8259A был контроллером прерываний для шины ISA в исходных IBM PC и IBM PC AT .
8259 был представлен как часть семейства Intel MCS 85 в 1976 году. 8259A был включен в оригинальный ПК, представленный в 1981 году, и поддерживался PC/XT , представленным в 1983 году. Второй 8259A был добавлен с введением PC /AT . 8259 сосуществовал с архитектурой Intel APIC с момента ее введения в симметричных многопроцессорных ПК. Современные ПК начали постепенно отказываться от 8259A в пользу архитектуры Intel APIC. Однако, хотя он больше не является отдельным чипом, интерфейс 8259A по-прежнему предоставляется Platform Controller Hub или южным мостом на современных материнских платах x86 . [1]
Основные сигнальные контакты на 8259 следующие: восемь входных линий запроса прерывания с именами IRQ0 - IRQ7, выходная линия запроса прерывания с именем INTR, линия подтверждения прерывания с именем INTA, D0 - D7 для передачи уровня прерывания или смещения вектора. Другие соединения включают CAS0 - CAS2 для каскадирования между 8259.
К главному устройству 8259 можно каскадно подключить до восьми подчиненных устройств 8259, чтобы обеспечить до 64 прерываний IRQ. Устройства 8259 подключаются каскадно путем подключения линии INT одного подчиненного устройства 8259 к линии IRQ одного главного устройства 8259.
Операции завершения прерывания (EOI) поддерживают определенный EOI, неопределенный EOI и автоматический EOI. Определенный EOI указывает уровень IRQ, который он подтверждает в ISR. Неопределенный EOI сбрасывает уровень IRQ в ISR. Автоматический EOI сбрасывает уровень IRQ в ISR сразу после подтверждения прерывания.
Режимы запуска прерывания по фронту и уровню поддерживаются 8259A. Поддерживаются режимы фиксированного приоритета и чередующегося приоритета.
8259 может быть настроен для работы с 8080/8085 или 8086/8088. На 8086/8088 контроллер прерываний будет предоставлять номер прерывания на шине данных, когда происходит прерывание. Цикл прерывания 8080/8085 будет выдавать три байта на шине данных (соответствующие инструкции CALL в наборе инструкций 8080/8085).
8259A обеспечивает дополнительную функциональность по сравнению с 8259 (в частности, буферизованный режим и режим запуска по уровню) и совместим с ним снизу вверх.
Программирование 8259 совместно с DOS и Microsoft Windows породило ряд запутанных проблем в целях обеспечения обратной совместимости, которая существовала еще с момента появления первого ПК в 1981 году.
Первая проблема более или менее является корнем второй проблемы. Ожидается, что драйверы устройств DOS отправят неспецифический EOI на 8259, когда закончат обслуживание своего устройства. Это предотвращает использование любого из других режимов EOI 8259 в DOS и исключает дифференциацию между прерываниями устройств, перенаправленными с ведущего 8259 на ведомое 8259.
Вторая проблема связана с использованием IRQ2 и IRQ9 с момента появления ведомого устройства 8259 в PC/AT. Выход INT ведомого устройства 8259 подключен к IR2 ведущего устройства. Линия IRQ2 шины ISA, изначально подключенная к этому IR2, была перенаправлена на IR1 ведомого устройства. Таким образом, старая линия IRQ2 теперь генерирует IRQ9 в ЦП. Для обеспечения обратной совместимости с драйверами устройств DOS, которые все еще настроены на IRQ2, BIOS устанавливает обработчик для IRQ9, который перенаправляет прерывания на исходный обработчик IRQ2.
На ПК BIOS (и, следовательно, также DOS) традиционно сопоставляет запросы прерывания master 8259 (IRQ0-IRQ7) со смещением вектора прерывания 8 (INT08-INT0F), а запросы прерывания slave 8259 (в PC/AT и более поздних версиях) (IRQ8-IRQ15) со смещением вектора прерывания 112 (INT70-INT77). Это было сделано, несмотря на то, что первые 32 (INT00-INT1F) вектора прерывания были зарезервированы процессором для внутренних исключений (по какой-то причине это было проигнорировано при проектировании ПК). Из-за зарезервированных векторов для исключений большинство других операционных систем сопоставляют (по крайней мере master) IRQ 8259 (если используется на платформе) с другим смещением базы вектора прерывания.
Поскольку большинство других операционных систем допускают изменения в ожиданиях драйверов устройств, могут использоваться другие режимы работы 8259, такие как Auto-EOI. Это особенно важно для современного оборудования x86 , в котором значительное количество времени может тратиться на задержку адресного пространства ввода-вывода при взаимодействии с 8259. Это также позволяет использовать ряд других оптимизаций при синхронизации, таких как критические разделы, в многопроцессорной системе x86 с 8259.
Так как шина ISA не поддерживает прерывания, запускаемые уровнем , режим запускаемого уровнем не может использоваться для прерываний, подключенных к устройствам ISA. Это означает, что в системах PC/XT, PC/AT и совместимых системах 8259 должен быть запрограммирован для режима запускаемого уровнем . В системах MCA устройства используют прерывания, запускаемые уровнем, а контроллер прерываний жестко настроен на постоянную работу в режиме запускаемого уровнем. В более новых системах EISA, PCI и более поздних системах регистры управления уровнем/краем (ELCR) управляют режимом по каждой линии IRQ, что фактически делает режим 8259 неактуальным для таких систем с шинами ISA. ELCR программируется BIOS при запуске системы для корректной работы.
Регистры ELCR расположены по адресам 0x4d0 и 0x4d1 в адресном пространстве ввода-вывода x86. Они имеют ширину 8 бит, каждый бит соответствует IRQ от 8259. Когда бит установлен, IRQ находится в режиме запуска по уровню; в противном случае IRQ находится в режиме запуска по фронту.
8259 генерирует ложные прерывания в ответ на ряд условий.
Первая — это снятие подтверждения линии IRQ до ее подтверждения. Это может произойти из-за шума на линиях IRQ. В режиме срабатывания по фронту шум должен удерживать линию в низком состоянии в течение 100 нс. Когда шум уменьшается, подтягивающий резистор возвращает линию IRQ в высокое состояние, тем самым генерируя ложное прерывание. В режиме срабатывания по уровню шум может вызвать высокий уровень сигнала на линии INTR системы. Если система отправляет запрос подтверждения, 8259 нечего решать, и поэтому он отправляет IRQ7 в ответ. Этот первый случай будет генерировать ложные IRQ7.
Аналогичный случай может возникнуть, когда демаскировка 8259 и деактивация входа IRQ не синхронизированы должным образом. Во многих системах вход IRQ деактивируется записью ввода-вывода, и процессор не ждет, пока запись достигнет устройства ввода-вывода. Если процессор продолжит и демаскирует IRQ 8259 до того, как вход IRQ будет деактивирован, 8259 снова выдаст INTR. К тому времени, как процессор распознает этот INTR и выдаст подтверждение на чтение IRQ из 8259, вход IRQ может быть деактивирован, и 8259 вернет ложный IRQ7.
Во-вторых, IRQ2 ведущего 8259 активен на высоком уровне, когда линии IRQ ведомого 8259 неактивны на заднем фронте подтверждения прерывания. Этот второй случай будет генерировать ложные IRQ15, но это случается редко.
Система PC/XT ISA имела один контроллер 8259, тогда как PC/AT и более поздние системы имели два контроллера 8259, главный и подчиненный. IRQ0–IRQ7 — это линии прерывания главного 8259, а IRQ8–IRQ15 — это линии прерывания подчиненного 8259. Метки на контактах 8259 — это IR0–IR7. IRQ0–IRQ15 — это названия линий шины ISA, к которым подключены 8259.