Контроллер прерываний Intel 8259A
8259A — это программируемый контроллер прерываний (Programmable Interrupt Controller, PIC), разработанный компанией Intel в конце 1970-х годов. Предназначен для управления запросами на прерывание от периферийных устройств в системах на базе микропроцессоров Intel x86. 8259A обрабатывает до восьми линий запросов прерываний (IRQ), может каскадироваться для увеличения количества обрабатываемых линий (до 64 при использовании девяти микросхем) и предоставляет гибкие возможности по приоритезации и маскированию прерываний. Микросхема стала стандартом де-факто для IBM PC и совместимых компьютеров, вплоть до замены на более современные контроллеры (APIC) в многопроцессорных системах.
История
Разработка 8259A велась в конце 1970-х годов как часть семейства микросхем поддержки для микропроцессора Intel 8086. Первые версии контроллера (8259) были выпущены в 1978 году. Усовершенствованная версия 8259A появилась в 1981 году и использовалась в IBM PC/XT. В IBM PC/AT (1984) для поддержки 16 линий прерываний два контроллера 8259A были соединены каскадно (master и slave). Эта конфигурация стала стандартной для всех последующих IBM-совместимых компьютеров.
До появления 8259A управление прерываниями в микропроцессорных системах часто реализовывалось дискретной логикой или более простыми контроллерами, что ограничивало гибкость и производительность. 8259A предложил программируемую архитектуру, позволяющую настраивать приоритеты, маскировать отдельные прерывания и управлять режимами обработки. Микросхема выпускалась в 28-выводном корпусе DIP (Dual In-line Package) и изготавливалась по n-МОП технологии.
С появлением многопроцессорных систем и шины PCI в 1990-х годах возможностей 8259A стало недостаточно. В частности, он не поддерживал распределение прерываний между несколькими процессорами (SMP) и имел ограниченное количество линий. На смену пришёл Advanced Programmable Interrupt Controller (APIC), который стал частью чипсетов и процессоров. Тем не менее, в режиме совместимости (legacy mode) эмуляция 8259A сохранялась вплоть до появления UEFI и современных операционных систем, таких как Windows 10 и Linux.
Архитектура и принцип работы
Основные компоненты
8259A состоит из нескольких функциональных блоков, работающих совместно:
- Каскадный буфер/компаратор (Cascade Buffer/Comparator) — управляет каскадированием нескольких контроллеров.
- Регистр запросов прерываний (Interrupt Request Register, IRR) — хранит состояние активных запросов на прерывание (IRQ0–IRQ7). При поступлении сигнала на соответствующую линию устанавливается бит в IRR.
- Регистр обслуживаемых прерываний (In-Service Register, ISR) — хранит информацию о прерываниях, которые в данный момент обслуживаются процессором. Бит устанавливается после подтверждения прерывания (INTA) и сбрасывается по команде EOI (End of Interrupt).
- Регистр маски прерываний (Interrupt Mask Register, IMR) — позволяет программно отключать (маскировать) отдельные линии прерываний. Установленный бит в IMR блокирует соответствующий запрос в IRR.
- Блок управления приоритетами (Priority Resolver) — определяет, какой из активных запросов имеет наивысший приоритет и должен быть передан процессору. Приоритеты могут быть фиксированными (IRQ0 — наивысший, IRQ7 — низший) или циклическими (round-robin).
- Блок управления (Control Logic) — координирует работу всех блоков, формирует сигналы запроса прерывания (INT) и подтверждения (INTA), а также управляет чтением/записью регистров через системную шину.
- Буфер данных (Data Bus Buffer) — обеспечивает обмен данными между 8259A и процессором.
- Регистры управления чтением/записью (Read/Write Logic) — декодирует адреса портов ввода-вывода и управляет передачей данных.
Процесс обработки прерывания
- Запрос: Периферийное устройство выставляет сигнал на одной из линий IRQ. Если соответствующий бит в IMR не установлен, запрос фиксируется в IRR.
- Приоритезация: Блок управления приоритетами выбирает запрос с наивысшим приоритетом среди активных.
- Запрос к процессору: Контроллер выставляет сигнал INT (Interrupt Request) на соответствующую ножку процессора.
- Подтверждение: Процессор, если прерывания разрешены (флаг IF в EFLAGS), завершает текущую инструкцию и выставляет сигнал INTA (Interrupt Acknowledge) на шину. 8259A получает два импульса INTA.
- Выдача вектора: При первом импульсе INTA контроллер фиксирует выбранный запрос в ISR и сбрасывает соответствующий бит в IRR. При втором импульсе INTA контроллер выдает на шину данных 8-битный вектор прерывания (номер), который процессор использует для поиска адреса обработчика в таблице векторов прерываний (Interrupt Vector Table, IVT).
- Обработка: Процессор переходит к выполнению обработчика прерывания.
- Завершение: В конце обработчика выполняется команда End of Interrupt (EOI), которая сбрасывает бит в ISR, позволяя обрабатывать следующие прерывания. EOI может быть специфическим (для конкретного IRQ) или неспецифическим (для текущего).
Режимы работы
8259A поддерживает несколько режимов, программируемых через управляющие слова:
- Режим фиксированного приоритета (Fixed Priority): IRQ0 — наивысший приоритет, IRQ7 — низший. После обслуживания прерывания приоритеты не меняются.
- Циклический приоритет (Rotating Priority): После обслуживания прерывания его приоритет становится низшим, а остальные сдвигаются. Это предотвращает «голодание» низкоприоритетных устройств.
- Режим специального маскирования (Special Mask Mode): Разрешает прерывания от устройств с более низким приоритетом, пока обслуживается текущее (полезно для вложенных прерываний).
- Режим буферизации (Buffered Mode): Используется в системах с шинными формирователями (буферами) данных. Контроллер управляет сигналом SP/EN (Slave Program/Enable Buffer).
- Автоматический EOI (Automatic EOI): Контроллер автоматически сбрасывает бит в ISR после второго импульса INTA, без необходимости программной команды EOI.
- Режим чтения (Read Mode): Позволяет считывать содержимое IRR, ISR и IMR через порты ввода-вывода.
Программирование 8259A
Порты ввода-вывода
В IBM PC/AT два контроллера 8259A занимают следующие порты:
- Master (ведущий): порт 0x20 (команды/данные) и 0x21 (маска/данные).
- Slave (ведомый): порт 0xA0 (команды/данные) и 0xA1 (маска/данные).
Управляющие слова
Программирование осуществляется через два типа управляющих слов:
- ICW (Initialization Command Words): Набор из 1–4 слов, задающих базовую конфигурацию (вектор, режим работы, каскадирование). ICW1 и ICW2 обязательны, ICW3 и ICW4 — опциональны.
- OCW (Operation Command Words): Набор из 3 слов, управляющих текущей работой (маскирование, EOI, чтение состояния). OCW1 задаёт маску, OCW2 — команды EOI и циклический приоритет, OCW3 — команды чтения IRR/ISR и установку специального маскирования.
Пример инициализации (для IBM PC/AT)
```c // Инициализация master (порт 0x20) outb(0x20, 0x11); // ICW1: каскадный режим, требуются ICW4 outb(0x21, 0x08); // ICW2: базовый вектор 0x08 (IRQ0 -> int 0x08) outb(0x21, 0x04); // ICW3: slave подключён к IRQ2 outb(0x21, 0x01); // ICW4: режим 8086, нормальный EOI
// Инициализация slave (порт 0xA0) outb(0xA0, 0x11); // ICW1 outb(0xA1, 0x70); // ICW2: базовый вектор 0x70 (IRQ8 -> int 0x70) outb(0xA1, 0x02); // ICW3: идентификатор slave = 2 outb(0xA1, 0x01); // ICW4 ```
Каскадирование
Для увеличения количества линий прерываний несколько контроллеров 8259A могут соединяться каскадно. Один контроллер выступает в роли ведущего (master), остальные — ведомые (slave). Выход INT ведомого подключается к одному из входов IRQ ведущего. При возникновении прерывания на ведомом, ведущий получает запрос и передаёт его процессору, а затем выясняет, какой именно ведомый выдал прерывание, через трёхбитный идентификатор (C0–C2). В IBM PC/AT используется два контроллера: master (IRQ0–IRQ7) и slave (IRQ8–IRQ15), подключённый к IRQ2 master.
Применение
8259A использовался во всех IBM PC и совместимых компьютерах до середины 1990-х годов. Он обеспечивал обработку прерываний от:
- Системного таймера (IRQ0)
- Клавиатуры (IRQ1)
- Контроллера прямого доступа к памяти (IRQ2, каскад)
- Последовательных портов (COM1/COM3 — IRQ4, COM2/COM4 — IRQ3)
- Параллельного порта (LPT1 — IRQ7)
- Контроллера гибких дисков (IRQ6)
- Жёсткого диска (IRQ14/IRQ15) и других устройств ISA/PCI.
Недостатки и ограничения
- Ограниченное количество линий: 8 на один контроллер, 16 в стандартной конфигурации IBM PC/AT.
- Отсутствие поддержки SMP: Не может распределять прерывания между несколькими процессорами.
- Фиксированный приоритет: В стандартном режиме IRQ0 всегда имеет наивысший приоритет, что может быть неэффективно.
- Программная сложность: Требует сложной инициализации и управления через порты ввода-вывода.
- Не поддерживает сообщения прерываний (MSI): Современные шины (PCI Express) используют MSI, что невозможно с 8259A.
Наследие
Несмотря на устаревание, 8259A остаётся важной частью истории вычислительной техники. Его архитектура заложила основы для управления прерываниями в x86-системах. В современных компьютерах функции 8259A эмулируются в чипсетах (например, Intel PIIX) или программно в режиме совместимости. Операционные системы, такие как Linux, поддерживают работу с 8259A через драйвер i8259 в legacy-режиме.
Источники
- Intel Corporation. 8259A Programmable Interrupt Controller Datasheet. 1988.
- Intel Corporation. Intel 82C59A CMOS Programmable Interrupt Controller Datasheet. 1992.
- IBM Corporation. IBM PC/AT Technical Reference. 1984.
- Shanley, Tom. ISA System Architecture. Addison-Wesley, 1995.
- Tanenbaum, Andrew S. Structured Computer Organization. 6th ed., Pearson, 2012.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →