Автор: lonesome TSH/Digital Daemons
Дата: .02.2003
Раздел: Разработка ОС
В качестве диспетчера аппаратных прерываний в системах на основе процессоров 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