Назад

Лекция  №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 определяют адрес, по которому находится точка входа в программу обработки прерывания.

Шлюз задачи предназначен для реализации принципиально иного перехода к обра­ботчику прерываний — с использованием механизма переключения задач.

 

!

 Обратим внимание, разработчики современных ОС редко используют шлюз задачи, т.к. переключение на другую задачу требует существенно больших затрат времени, а полное сохранение всех рабочих регистров часто не требуется. Таким образом, используются чаще всего шлюзы прерываний.

 

Назад