Rambler's
Top100

Перепрограммирование контроллера прерываний i8259A

Автор: 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 



Rambler's Top100