11/01/94 10:56pm
zr_prer.lek
А.В.Фролов, Г.В.Фролов "Защищенный
режим процессоров Intel 80286/80386/80486.
Практическое руководство по
использованию защищенного
режима" БСП том 6 М
"Диалог-МИФИ" 1993
В.Б.Бродин, И.И.Шагурин
"Микропоцессор i486. Архитектура,
программирование, интерфейс" М
"Диалог-МИФИ" 1993
--"i486tm микропроцессор" в 2-х
книгах Библиотека программиста
"И.В.К.-СОФТ" М 1993
Обработка прерывания в защищенном режиме работы процессора.
В защищенном режиме все прерывания делятся на два типа:
Обычные прерывания - по команде INT и внешние прерывания;
Исключения - аппаратные прерывания в оборудовании микропрцессора.
Для обращения к подпрограммам обслуживания прерываний создается дескрипторная таблица прерываний IDT (Interrup Descriptor Table). Эта таблица содержит системные дескрипторы - вентили прерываний, исключений и задач.
Таблица формируется в памяти, а ее адрес загружается в соответствующий регистр процессора. Загрузку регистра IDTR можно осуществить в реальном режиме перед переходом в защищенный режим или из нулевого кольца в защищенном режиме. Номер прерывания (вектор) используется ка индекс в таблице IDT.
Программы обработки прерываний оформляются в виде задач.
Исключения в защищенном режиме:
Исключения возникают при обнаружении процессорм некорректной ситуации. Перед передачей управления обработчику исключений процессор помещает в стек (если это необходимо) 16-ти битовый код ошибки:
INDEX - Содержит индекс дескриптора при обращении к которому произошла ошибка;
TI, I - Определяют какая из ТРЕХ таблиц имеется в виду (I=1 -> IDT; I=0,
TI=0 -> GDT; I=0, TI=1 -> LDT);
EXT - Устанавливается, если прерывание произошло по независящим от программы причинам - прерывание от устройства ввода/вывода или при обращении к сегменту со сброшенным битом присутствия.
Код ошибки формируется только для пяти исключений:
08h - двойная ошибка;
0Ah - недействирельный TSS;
0Bh - отсутствие сегмента в памяти;
0Ch - ошибка при работе стека;
0Dh - нарушение защиты памяти.
После устранения причины возникновения исключения можно перезапустить большинство команд, выполнив команду IRET (для таких команд в стек помещается ТЕКУЩИЙ адрес).
Повторно НЕ запускаются:
01h - прерывания для пошаговой работы;
08h - двойная ошибка;
09h - превышение сегмента арифметическим сопроцессором;
0Dh - нарушение защиты памяти;
10h - ошибка операции с плавающей точкой.
Обработка аппаратных прерываний:
Использовать аппаратные прерывания обычным образом в защищенном режиме невозможно, т.к. их вектора зарезервированны за исключениями микропроцессора. Для исключения противоречия контроллер прерываний перепрограммируется на другий диапозон адресов. Обычно для этой цели используется пространство сразу за областью исключений. При возврате в реальный режим BIOS восстанавливает исходную настройку.
При возникновении внешнего аппаратного прерывания обращение к соответствующей подпрограмме осуществляется через шлюз прерывания. При этом с точки зрения программиста все происходит как в реальном режиме. Такая система используется для обеспечения совместимости с микропроцессором i8086.
Обработка программных прерываний:
В защищенном режиме обычные прерывания BIOS не доступны. При выполнении команды INT управление пердается через шлюз задачи. Передача управления через шлюз требует больше времени, чем вызов процедуры это обусловлено большим количеством сохраняемой информации при преключении задач.