Перепрограммирование контроллера прерываний i8259A
В качестве диспетчера аппаратных прерываний в системах на основе
процессоров Intel применяется микросхема i8259A. Обычно используются 2
таких микросхемы (ведущий контроллер и ведомый контроллер), которые
каскадируются, - подключаются последовательно друг к другу.
Микросхема имеет восемь входов irq0-irq7, т.е. две в совокупности могут
обрабатывать прерывания от 15 внешних устройств (один из входов ведущего
контроллера используется для подсоединения к нему ведомого). Теоретически
с помощью каскадирования можно соединить восемь контроллеров (по одному
ведомому в каждый вход irq ведущего)
Несмотря на то, что в современных системах применяется только векторный
режим прерываний (т.е. по поступлению аппаратного прерывания ведущий
контроллер прерывает работу микропроцессора, который выполняет некоторый
обработчик прерывания), микросхема i8259A поддерживает режим
опроса. Находясь в таком режиме контроллер не прерывает процессор,
который для получения информации о прерывании должен самостоятельно
обратиться к контроллеру.
Управлять контроллером можно через 8-битные порты 0x20 и 0x21. Наиболее
часто возникает необходимость переопределить базовый вектор
контроллера. BIOS определяют его как 0x8 - т.е. прерывания базового
контроллера нумеруются с 0x8. Проблема возникает при переходе в защищенный
режим, поскольку процессоры Intel резервируют прерывания 0x0-0x1F для
обработки исключений. Поэтому при переходе в защищенный режим необходимо
перенаправить базовый вектор на 0x20 или выше. Это достигается следующей
последовательностью комманд
;Установка базового вектора прерывания в 0x20:
;Первый байт посылаемый в порт 0x20 определяет, какие
;команды последуют за ним
;В частности НЕ установленный бит 1 определяет
;каскадное подключение контроллеров
;Установленный бит 4 определяет этот байт как ICW1
;(initialization control word)
mov al,00010001b
out 0x20,al
;Следующий байт (ICW2) определяет базовый вектор
;контроллера. В данном случае это 0x20
mov al,0x20
out 0x21,al
;Байт ICW3 управляет каскадированием контроллеров
;Каждый его бит сообщает подключен ли к соответствующему
;irq ведомый контроллер
;В данном случае ведомый контроллер подключен к irq2
mov al,00000100b
out 0x21,al
;Байт ICW4 указывает другие параметры обработки прерываний
;Неустановленный бит 1 определяет ручной EOI (end of interrupt)
;т.е после обработки аппаратного прерывания обработчик
;должен самостоятельно послать сигнал EOI, чтобы
;возобновить обработку прерываний
;(EOI - 0x20 в 0x20'ый порт)
mov al,00000001b
out 0x21,al