Intel 8259
Intel 8259 — семейство программируемых контроллеров прерывания (ПКП), разработанных компанией Intel для микропроцессоров Intel 8080, Intel 8085, Intel 8086 и некоторых Intel 80186. Семейство первоначально состояло из моделей 8259, 8259A и 8259B, но к текущему дню другими производителями были созданы многие другие совместимые модели. 8259 действует как мультиплексор, объединяя несколько источников прерывания в один источник прерывания, чтобы прервать другое устройство, для которого упрощается обработка уровней приоритета прерываний и их возможной вложенности.
История
[править | править код]Первоначальная версия контроллера была предназначена только для процессоров 8080 и 8085. По сигналу подтверждения прерывания она выдавала на шину три байта, первый соответствовал коду операции "Вызов подпрограммы" (значение 0xCD в шестнадцатеричной системе), затем два байта адреса вызова этой подпрограммы, которые нужно было записать в соответствующие каждому источнику прерывания внутренние регистры контроллера. Для процессоров семейства x86 была выпущена микросхема 8259A, так как механизм передачи управления изменился. Теперь на шину выдавались последовательно два байта, первый был "холостым", его значение микропроцессор игнорировал, во втором байте был номер вектора прерывания, а адрес, по которому следовало передавать исполнение программы, брался из таблицы векторов прерываний. У процессоров 8086, 80186 и 8088 она занимала самый нижний килобайт адресного пространства памяти. У более поздних, начиная с 80286, таблица векторов прерываний могла быть перемещена в любое место памяти.
8259A был включён в первоначальный состав IBM PC в 1980 и был оставлен и в архитектуре IBM PC/XT, которая была введена в 1983. С введением IBM PC/AT появился второй чип 8259A. Впоследствии семейство 8259A было вытеснено в пользу архитектуры Intel APIC, первоначально разработанной для многопроцессорных PC. Local APIC является частью процессора, начиная с самых первых Pentium, а, для многопроцессорных систем, на материнскую плату дополнительно устанавливался I/O APIC.
Фактически, с начала 1990-х 8259A не используется как отдельное устройство, а стал частью микросхемы чипсета, позднее южного моста. Одним из самых известных чипов, в котором была полностью интегрирована функциональность всех программируемых контроллеров, стоявших на плате IBM PC-AT, была микросхема 82C206, выпущенная фирмой Chips&Technologies в 1988 году.
В СССР 8259 выпускался как КР580ВН59, а 8259А, как Микросхема программируемого контроллера приоритетных прерываний КР1810ВН59А[1]
Основные используемые в 8259 выводы:
- IRQ0…IRQ7 — восемь входных линий запросов на прерывание;
- INTR — мультиплексированная выходная линия запроса на прерывание;
- INTA — входная линия подтверждения прерывания;
- D0..D7 — двунаправленные выводы на шину данных для сообщения уровня прерывания или значения смещения вектора прерывания;
- CAS0..CAS2 — выходы для реализации каскадирования нескольких 8259.
К ведущему 8259 могут быть подключены до 8 ведомых устройств 8259, обеспечивая обработку до 64 прерываний. При каскадировании выход INT ведомого подключается к одной из линий IRQ ведущего устройства 8259.
У 8259 три регистра:
- Interrupt Mask Register (IMR) (Регистр маскирования запросов на прерывания) — описывает, прерывания каких уровней сейчас заблокированы (замаскированы)
- Interrupt Request Register (IRR) (Регистр запросов на прерывания) — описывает, какие прерывания сейчас ожидают подтверждения
- In-Service Register (ISR) (Регистр обрабатываемых запросов) — описывает, какие прерывания сейчас активны и требуют команды на завершение прерывания (EOI — End Of Interrupt).
Операции завершения прерывания (EOI) подразделяются на специфицированные, неспецифицированные и автоматические. Специфическая операция EOI указывает какой уровень прерывания требует подтверждения в ISR (фактически, указывает какой бит сбросить в ISR). Неспецифицированная команда EOI сбрасывает линию IRQ с наибольшим приоритетом из обрабатываемых. Автоматический режим EOI сбрасывает бит в ISR сразу после подтверждения прерывания.
Поддерживаются режимы прерываний по фронту и по уровню.
Поддерживаются режимы фиксированного и циклического сдвига приоритетов.
8259A может быть настроен на работу с 8088 или 8086. То есть на 8-и или 16-и битную шину данных.
Особенности программирования
[править | править код]DOS и Windows
[править | править код]Программирование 8259A под DOS и Microsoft Windows вызвало значительное число смущающих проблем, вызванных стремлением сохранить обратную совместимость, корни которых зародились ещё при появлении первых PC в 1981.
Первая проблема более или менее источник второй. Драйверы устройств DOS должны посылать неспецифицированную команду EOI после завершения обслуживания своего устройства. Из-за этого использование других режимов завершения прерывания затруднено (не всегда можно гарантировать, что нужный уровень не сбросится ранее). А также делает невозможным различить прерывания, перенаправленные от ведущего устройства 8259 к ведомому.
Вторая проблема возникает при использовании IRQ2 и IRQ9, которая появилась при появлении ведомого 8259A в PC/AT. Выход INT ведомого 8259 подсоединён к линии IRQ2 ведущего. Линия IRQ2 шины ISA, ранее подключенная к этой линии, теперь была перенаправлена к выходу IRQ1 ведомого. Так что теперь прерывание IRQ2 шины вызывает прерывание IRQ9. Для совместимости с драйверами DOS, которые всё ещё ожидают IRQ2, был добавлен обработчик, который перенаправляет IRQ9 на первоначальный обработчик IRQ2.
В PC BIOS (и, следовательно, DOS) традиционно отображает запросы на прерывания ведущего 8259 (IRQ0-IRQ7) на вектора прерываний INT08-INT0F соответственно. А запросы ведомого 8259A (в PC/AT и далее) IRQ8-IRQ15 на INT70-INT77. Это было сделано, несмотря на то, что первые 32 вектора прерываний зарезервированы под внутренние прерывания процессора (по каким-то причинам разработчики архитектуры PC проигнорировали этот факт). Поэтому большинство других операционных систем отображают прерывания (по крайней мере, для ведущего 8259) на другой диапазон векторов прерываний.
Другие операционные системы
[править | править код]Большинство других операционных систем позволяют использовать и другие режимы операций 8259A, таких как автоматическое завершение прерывания. Это особенно важно для современных систем на базе x86, в которых значительное количество времени может быть затрачено впустую на задержках обращений в пространстве ввода-вывода при операциях с 8259. Это также позволяет ввести дополнительные способы оптимизации синхронизации, такие как критические секции, в мультипроцессорных системах с устройствами 8259.
Режим работы по фронту/по уровню
[править | править код]Так как шина ISA не поддерживает прерывания по уровню, то для систем PC/XT, PC/AT и MCA 8259A должен быть настроен на работу по фронту. На более новых EISA, PCI и последующих существуют регистры управления работой по фронту/по уровню (Edge/Level Control Registers (ELCRs)), которые позволяют настраивать режим работы для каждой линии IRQ индивидуально, что фактически устраняет необходимость в установке режима работы 8259 для таких систем с ISA шиной.
Эти регистры расположены по адресам 0x4d0 и 0x4d1 пространстве адресов ввода-вывода x86. Их размерность 8 бит, каждый бит соответствует одной из линий IRQ 8259A. Когда бит установлен, то линия IRQ срабатывает по уровню, иначе по фронту.
Спонтанные прерывания
[править | править код]При определённых условиях 8259A может сгенерировать спонтанное прерывание, обычно IRQ7 и, гораздо реже, IRQ15.
В первом случае линия IRQ сбрасывается раньше, чем подтверждается. Это может произойти из-за шума на линиях IRQ. В режиме работы по фронту, шум должен удержать линию в высоком состоянии на 100нс (минимальное время для записи в триггер IRR). Когда шум уйдёт, резистор подтяжки вернёт уровень IRQ в низкое состояние, таким образом порождая ложное прерывание. В режиме работы по уровню, шум может вызвать высокое состояние на линии INTR. Когда система выдаст запрос на подтверждение прерывания, 8259 не будет иметь данных для его разрешения и выдаст IRQ7 (значение, выставляемое по умолчанию). Так могут появиться ложные IRQ7.
Похожий случай может появиться, когда демаскирование 8259A и сброс линии IRQ не тщательно синхронизированны. Во многих системах линия IRQ сбрасывается командой записи в пространство адресов ввода-вывода, и процессор не ожидает того, чтобы команда достигла устройства ввода-вывода. Если процессор продолжит и демаскирует соответствующий уровень 8259A до того, как произошёл сброс линии IRQ от устройства, 8259A снова выдаст запрос на прерывание INTR. К тому времени, как процессор распознает этот запрос INTR и выдаст подтверждение, линия IRQ может быть сброшена, и 8259A вернёт спонтанное прерывание IRQ7.
Второй случай похож на первый, за исключением того, что указанная ситуация прилагается к ведомому устройству, то есть когда линия ведущего IRQ2 активна в момент, когда линии IRQ ведомого 8259 неактивны к падающему фронту подтверждения прерывания (INTA). В этом случае будут проявлять спонтанные IRQ15, но это крайне редкий случай.
Поэтому, при работе с IRQ7 рекомендуется проверять в начале обработчика прерывания на повторное вхождение и проверять регистр ISR 8259A для того, чтобы определить, что это не спонтанное прерывание, а прерывание, действительно пришедшее от линии IRQ7.
PC/XT и PC/AT
[править | править код]В архитектуре IBM PC/XT был только один контроллер прерываний 8259A, а начиная с IBM PC/AT системы получили второй, ведомый 8259A. Линии IRQ0…IRQ7 это линии IR0..IR7 ведущего 8259A, а линии IRQ8…IRQ15 это линии IR0..IR7 ведомого 8259A. IRQ0…IRQ15 это линии шины ISA, к которой исторически были подключены 8259A.
- Ведущий 8259A
- IRQ0 — Intel 8253 или Intel 8254 Программируемый контроллер таймера
- IRQ1 — Intel 8042 Контроллер клавиатуры
- IRQ2 — в PC/XT не был назначен; в PC/AT используется для каскадирования ведомого 8259, теоретически мог использоваться видеокартой EGA.
- IRQ3 — COM2 и COM4
- IRQ4 — COM1 и COM3
- IRQ5 — контроллер жёсткого диска в PC/XT; LPT2 в PC/AT
- IRQ6 — контроллер дисковода
- IRQ7 — LPT1
- Ведомый 8259A (только в PC/AT и последующих)
- IRQ8 — часы реального времени (RTC)
- IRQ9 — нет обычных назначений, использовался некоторыми видеокартами, особенно, ранними ускорителями, например S3 928 и подобными.
- IRQ10 — нет обычных назначений, часто использовался звуковыми картами, совместимыми с Sound Blaster Pro и более поздними.
- IRQ11 — нет обычных назначений
- IRQ12 — контроллер мыши PS/2
- IRQ13 — математический сопроцессор
- IRQ14 — контроллер жёсткого диска 1
- IRQ15 — контроллер жёсткого диска 2
Первоначально IRQ7 был обычным выбором для использования в звуковых картах, но позднее в этой роли использовали IRQ5, чтобы избежать конфликта с портом принтера LPT. Последовательные порты часто отключались, чтобы освободить линию IRQ для другого устройства.
См. также
[править | править код]Примечания
[править | править код]- ↑ Под. ред. чл.-корр. АН УССР Б.Н.Малиновского. Глава 2.6. Микросхема программируемого контроллера приоритетных прерываний КР1810ВН59А // Справочник по персональным ЭВМ = Справочник по персональным ЭВМ. — К.: Тэхника, 1990. — С. 384. — ISBN 5-335-00168-2. Стр.81
Литература
[править | править код]- 8259A Programmable Interrupt Controller (англ.) — Описание 8259А от Intel
- Gilluwe, Frank van. The Undocumented PC. A-W Developers Press, 1997. ISBN 0-201-47950-8
- McGivern, Joseph. Interrupt-Driven PC System Design. Annabooks, 1998. ISBN 0-929392-50-7