Лекция №13
Система
прерываний 32-разрядных микропроцессоров i80x86.
Работа системы
прерываний в защищенном режиме
Вопросы
1.
Отличия работы системы прерываний в защищенном режиме
2. Классификация прерываний в защищенном режиме
3. Таблица дескрипторов прерываний IDT
4. Обобщенная схема обработки прерывания в защищенном режиме
5. Шлюз ловушки
6. Шлюз прерывания
7. Шлюз задачи
8.
Резюме
Обработка прерываний в защищенном режиме отличается от обработки в реальном режиме так же сильно, как и защищенный режим отличается от реального.
Потому что:
1.
В защищенном режиме немного изменено распределение
номеров векторов прерываний. (Можно самостоятельно посмотреть по таблицам,
например, в книге Аssembler Юрова,
Хорошенко на стр. 439-441)
2.
Принципиально иным является механизм обработки
прерываний.
Классификация прерываний в защищенном режиме
Прерывания и исключения можно разделить на несколько групп:
1. сбой;
2. ловушка;
3.
аварийное завершение.
Это деление производится в соответствии со следующими признаками:
· какая информация сохраняется о месте возникновения прерывания (исключения)?
· возможно ли возобновление прерванной программы?
Исходя из этих признаков, можно дать следующие характеристики вышеперечисленным группам:
Сбой (ошибка) — прерывание или исключение, при возникновении которого в стек записываются значения регистров cs: ip, указывающие на команду, вызвавшую данное прерывание. Это позволяет, получив доступ к сегменту кода, исправить ошибочную команду в обработчике прерывания и, вернув управление программе, фактически осуществить ее рестарт (вспомните, что в реальном режиме при возникновении прерывания в стеке всегда запоминается адрес команды, следующей за той, которая вызвала это прерывание).
Ловушка — прерывание или исключение, при возникновении которого в стек записываются значения регистров cs: ip, указывающие на команду, следующую за командой, вызвавшей данное прерывание.
Так же, как и в случае
ошибок возможен рестарт программы. Для этого необходимо лишь исправить в
обработчике прерывания соответствующие код или данные, послужившие источником
ошибки. После этого перед возвратом управления нужно скорректировать значение ip в
стеке на длину команды, вызвавшей данное прерывание.
Механизм ловушек похож на механизм прерываний в реальном режиме, хотя не во всем. Здесь есть один тонкий момент. Если прерывание типа ловушки возникло в команде передачи управления jmp, то содержимое пары cs: ip в стеке будет отражать результат этого перехода, то есть соответствовать команде назначения.
Аварийное завершение — прерывание, при котором информация о месте его возникновения недоступна или неполна и поэтому рестарт практически невозможен, если только данная ситуация не была запланирована заранее.
Þ соответствующие программы-обработчики ошибок, ловушек и аварий будут отличаться алгоритмами работы.
Микропроцессор жестко определяет, какие прерывания являются ошибками, ловушками и авариями.
Замечания.
Для некоторых номеров прерываний в реальном режиме возможны 2 источника прерывания (развитие микропроцессоров).
Некоторые прерывания при своем возникновении дополнительно генерируют и записывают в стек так называемый код ошибки. Этот код может впоследствии использоваться для установления источника прерывания. Код ошибки записывается в стек вслед за содержимым регистров eflags, cs и eip.
Þ можно распознать истинный источник прерывания (если есть неоднозначность).
Таблица дескрипторов прерываний IDT
Вместо таблицы векторов
прерываний система прерываний имеет дело с таблицей дескрипторов прерываний (IDT, interrupt descriptor table)
Таблица IDT связывает каждый вектор прерывания с дескриптором процедуры или задачи, которая будет обрабатывать это прерывание.
Элементами таблицы IDT являются дескрипторы - Размер дескриптора = 8 байтам.
(Т.е. формат таблицы IDT подобен формату GDT и LDT.)
Дескрипторы в таблице прерываний обычно называются шлюзами (иногда коммутаторами).
Шлюзы предназначены для указания точки входа в программу обработки прерывания.
В дескрипторной
таблице прерываний IDT могут содержаться шлюзы трех типов:
· шлюз ловушки;
· шлюз прерывания;
· шлюз задачи.
Физически микропроцессор отличает шлюзы по содержимому полей.
Особенности таблицы IDT:
· нулевой дескриптор используется для описания шлюза для программы обработки исключительной ситуации 0 (ошибка деления);
(в
таблице GDT отсутствует)
· дескрипторы в таблице IDT строго упорядочены в соответствии с номерами прерываний.
В
таблицах GDT и LDT порядок описания дескрипторов роли не играет, хотя и
допускается наличие некоторых соглашений по их упорядоченности;
· размерность таблицы IDT — не более 256 элементов размером по восемь байт, по числу возможных источников прерываний.
В отдельных случаях есть
смысл описывать все 256 дескрипторов этой таблицы, формируя для неиспользуемых
номеров прерываний шлюзы-заглушки. Это позволит корректно обрабатывать все
прерывания, даже если они и не планируются к использованию в данной задаче.
Если этого не сделать, то при незапланированном прерывании с номером,
превышающим пределы IDT для данной задачи, будет возникать исключительная
ситуация общей защиты (с номером 13 (ODh)).
Адрес и длина таблицы IDT содержатся в регистре idtr.
Заметим, что в реальном режиме
регистр idtr также содержит адрес
таблицы прерываний, но при этом каждый вектор занимает 4 байта и содержит
32-разрядный адрес в формате CS:IP. Начальное значение этого
регистра равно нулю, но внего можно занести и другое значение.
! |
Þ Возможно произвольное
размещение в памяти этой таблицы не только в защищенном режиме, но и реальном.
В защищенном режиме произвести загрузку регистра idtr может только код с максимальным уровнем привилегий.
! |
Доступ к таблице IDT со стороны
пользовательских (прикладных) программ невозможен.
Обобщенная схема обработки прерывания в защищенном режиме
При возникновении прерывания от источника с номером п микропроцессор, находясь в защищенном режиме, выполняет следующие действия:
1. Определяет местонахождение таблицы IDT, адрес и размер которой содержится в регистре idtr.
2. Складывает значение адреса, по которому размещена IDT, и значение n*8. По данному смещению в таблице IDT должен находиться 8-байтовый дескриптор, определяющий местоположение процедуры обработки прерывания.
3.
Переключается на процедуру обработки прерывания.
Шлюз
ловушки
Формат шлюза ловушки —
offset_2 |
p |
dpl |
0 |
1 1 1 1 |
000 |
не используется |
63 47
39 36 32
indicator |
offset_1 |
31 15
0
Offset_1, offset_2 - первая и вторая половины смещения в сегменте
indicator - Селектор, указывающий на дескриптор в LDT или GDT
000 - Постоянное значение
type - 1111 - Тип шлюза — ловушка
dpl - Определение
минимального уровня привилегий задачи, которая может передать управление
обработчику прерываний через данный шлюз (обычно dpl =
112)
p - Бит присутствия (0 или 1)
Когда возникает
прерывание и его вектор выбирает в таблице IDT дескриптор шлюза с типом ловушки, микропроцессор сохраняет в
стеке информацию о месте, где он прервал работу текущей программы. После этого
он передает управление в соответствии с полями indicator и offset.
Поле indicator представляет
селектор одной из таблиц, GDT или LDT, в зависимости от состояния бита TI в нем.
Поле offset определяет смещение в
сегменте кода. Этот сегмент кода описывается дескриптором, на который указывает
селектор в поле indicator.
После того как
управление было передано обработчику прерывания, он выполняет свою работу до
тех пор, пока не встретит команду iret. Эта команда восстанавливает из стека состояние регистров eflags, cs и eip на момент возникновения
прерывания, и работа приостановленной программы продолжается.
! |
При подготовке выхода из программы обработки прерывания
имейте в виду, что команда iret ничего не знает о возможности наличия в стеке
кода ошибки, поэтому для корректного возврата управления не забудьте при
необходимости предварительно удалить командой pop код ошибки из стека.
Шлюз
прерывания
Шлюз
прерывания отличается
только полем типа = 1110.
При
возникновении прерывания, которому соответствует шлюз прерывания,
микропроцессор выполняет те же действия, что и для шлюза ловушки, но с одним важным
отличием:
при
передаче управления обработчику прерывания через шлюз прерывания,
микропроцессор сбрасывает флаг прерывания в регистре eflags в 0, запрещая тем самым обработку аппаратных прерываний.
Этот факт имеет важное значение для программирования обработчиков аппаратных и
программных прерываний.
Совет. Если у вас есть сомнение в том, какой из шлюзов -
прерывания или ловушки - использовать — применяйте шлюз прерывания.
Шлюз задачи
Шлюз
задачи отличается
1) поле типа = 1110
2) поле indicator вместо селектора сегмента кода указывает на дескриптор сегмента состояния задачи (TSS).
Осуществляется переход на новую задачу, которая будет осуществлять обработку прерывания. Задача является частью механизма многозадачности. Т.е. производится переключение задач. (Текущее состояние прерываемой задачи аппаратно сохраняется в ее собственном TSS.)
Для каждой задачи
определяется сегмент состояния задачи TSS (Task Segment Status) со строго определенной структурой. В этом сегменте
есть поля для сохранения всех регистров общего назначения, некоторых системных
регистров и другой информации. Всю совокупность этой информации называют контекстом задачи. Этот сегмент
описывается, подобно другим сегментам, дескриптором в таблице GDT или LDT.
Если с помощью некоторого
селектора обратиться к такому дескриптору, то микропроцессор осуществит
переключение на соответствующую задачу. Подобные переключения могут, в частности, осуществляться
операционной системой, поддерживающей многозадачность, в соответствии с
некоторой дисциплиной разделения времени между задачами. Переключение задач
может производиться обычными командами межсегментной передачи управления
либо по возникновению прерывания при переходе к обработчику прерывания
через шлюз задачи.
РЕЗЮМЕ
Шлюзы ловушки и прерывания с помощью полей indicator и offset определяют адрес, по которому находится точка входа в программу обработки прерывания.
Шлюз задачи предназначен для реализации принципиально иного перехода к обработчику прерываний — с использованием механизма переключения задач.
! |
Обратим внимание, разработчики современных ОС редко используют шлюз задачи, т.к. переключение на другую задачу требует существенно больших затрат времени, а полное сохранение всех рабочих регистров часто не требуется. Таким образом, используются чаще всего шлюзы прерываний.