
- •1. 6. Основы программной инициализации и изменения режимов работы pic
- •1. 7. Основные функции и назначения основных битов приказов инициализации
- •1. 8. Слова рабочих приказов
- •§ 3. Организация прерываний в реальном и защищенном режимах в старших моделях семейства Intel 80x86, Pentium
- •3.1. Аппаратные средства системы прерываний Intel 80x86
- •3.2. Реальный режим и его основные особенности
- •3.3. Основные отличия r-режима старших моделей Intel 80x86 от Intel 8086
- •3.4. Особенности организации прерываний в реальном режиме
- •3.4.1. Программные средства системы прерываний реального режима
- •3.4.2. Идеология организации прерываний в процессорах Intel 80х86
- •3.4.3. Этапы обработки прерываний в реальном режиме процессоров Intel 80х86
- •3.4.4. Основные отличия обработки прерываний в r-режиме по сравнению с базовой моделью Intel 8086
- •3.4. Организация прерываний в защищенном режиме
- •3.4.1 Основные положения
- •3.5. Расширенная классификация прерываний в защищенном режиме
- •3.6. Дескрипторная таблица прерываний и ее элементы
- •Шлюз ловушки
- •Шлюз прерывания
- •Шлюз задач
- •Код ошибки
- •3.7. Обобщенная схема обработки прерывания в защищенном режиме
- •§ 4. Система прерываний пэвм ibm pc
- •4.1. Основные сведения
- •4.2. Действия микропроцессора при возникновении прерывания в ibm pc
- •4.3. Обработка прерывания в реальном режиме и в защищенном режиме
3.6. Дескрипторная таблица прерываний и ее элементы
В отличие от таблицы векторов прерываний, местоположение которой в памяти является строго регламентированным (она находится в младших адресах), IDT, в принципе, может размещаться в любом месте линейного адресного пространства, однако, как правило, для сохранения преемственности ее также располагают в младших адресах. Локализация IDT в линейном адресном пространстве и ее допустимый размер задаются содержимым системного регистра IDTR (этот регистр, так же как и GDTR является 48-разрядным: 32 бита – Base, 16 бит – Limit). Максимальный размер IDT должен быть рассчитан на 256 типов прерываний и составляет 2 Ki байта. В свою очередь минимальный размер IDT должен быть рассчитан по крайней мере на 32 зарезервированных типов прерываний.
Особенности таблицы IDT:
1) нулевой дескриптор используется для описания шлюза для программы обработки исключительной ситуации 0 (ошибка деления), (в таблице GDT отсутствует);
2) дескрипторы в таблице IDT строго упорядочены в соответствии с номерами прерываний. В таблицах GDT и LDT порядок описания дескрипторов роли не играет, хотя и допускается наличие некоторых соглашений по их упорядоченности;
3) размерность таблицы IDT – не более 256 элементов размером по восемь байт, по числу возможных источников прерываний.
В отдельных случаях есть смысл описывать все 256 дескрипторов этой таблицы, формируя для неиспользуемых номеров прерываний шлюзы-заглушки. Это позволит корректно обрабатывать все прерывания, даже если они и не планируются к использованию в данной задаче. Если этого не сделать, то при незапланированном прерывании с номером, превышающим пределы IDT для данной задачи, будет возникать исключительная ситуация общей защиты (с номером 13 (0Dh)).
Адрес и длина таблицы IDT содержатся в регистре IDTR.
Заметим, что в реальном режиме регистр IDTR также содержит адрес таблицы прерываний, но при этом каждый вектор занимает 4 байта и содержит 32-разрядный адрес в формате CS:IP. Начальное значение этого регистра равно нулю, но в него можно занести и другое значение.
Возможно произвольное размещение в памяти этой таблицы не только в защищенном режиме, но и реальном.
В защищенном режиме произвести загрузку регистра IDTR может только код с максимальным уровнем привилегий.
Доступ к таблице IDT со стороны пользовательских (прикладных) программ невозможен.
Элементами IDT являются 8-байтные дескрипторы, представляющие собой системные объекты в виде шлюзов.
Шлюзы предназначены для указания точки входа в программу обработки прерывания.
В IDT могут находиться шлюзы трех видов:
• шлюзы прерываний;
• шлюзы ловушек;
• шлюзы задач.
Физически микропроцессор отличает шлюзы по содержимому полей.
Шлюз ловушки
Структура шлюзов прерываний и ловушек идентична и имеет следующий вид:
ARB
offset (31-16) |
P |
DPL |
0 |
TYPE |
Не исп-ся |
63 48 47 40 39 36 32
selector |
offset (15-0) |
31 15 0
Рисунок 14.12 – Структура шлюзов прерываний и ловушек
selector - селектор, указывающий на дескриптор в LDT или GDT.
000 - постоянное значение.
Offset_1, offset_2 - первая и вторая половины смещения в сегменте.
DPL - Определение минимального уровня привилегий задачи, которая может передать управление обработчику прерываний через данный шлюз (обычно DPL = 112).
Р - бит присутствия (0 или 1).
Для шлюза прерываний TYPE = Eh (1110).
Для шлюза ловушек TYPE = Fh (1111).
Когда возникает прерывание и его вектор выбирает в таблице IDT дескриптор шлюза с типом ловушки, микропроцессор сохраняет в стеке информацию о месте, где он прервал работу текущей программы. После этого он передает управление в соответствии с полями selector и offset.
Поле selector представляет селектор одной из таблиц, GDT или LDT, в зависимости от состояния бита TI в нем.
Поле offset определяет смещение в сегменте кода. Этот сегмент кода описывается дескриптором, на который указывает селектор в поле indicator.
После того как управление было передано обработчику прерывания, он выполняет свою работу до тех пор, пока не встретит команду iret. Эта команда восстанавливает из стека состояние регистров eflags, cs и eip на момент возникновения прерывания, и работа приостановленной программы продолжается.
При подготовке выхода из программы обработки прерывания имейте в виду, что команда iret ничего не знает о возможности наличия в стеке кода ошибки, поэтому для корректного возврата управления не забудьте при необходимости предварительно удалить командой pop код ошибки из стека.