Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SysSoft.doc
Скачиваний:
519
Добавлен:
16.03.2016
Размер:
4.36 Mб
Скачать

Обработка прерываний в контексте текущей задачи

Рассмотрим рис. 3.13, поясняющий обработку прерывания в контексте текущей задачи. При возникновении прерывания процессор по номеру прерывания индексирует таблицу IDT, то есть адрес соответствующего коммутатора определя­ется путем сложения содержимого поля адреса в регистре IDTR и номера преры­вания, умноженного на 8 (справа к номеру прерывания добавляются три нуля). Полученный дескриптор анализируется, и если его тип соответствует коммута­тору trap gateили коммутаторуinterrupt gate, то выполняются следующие дей­ствия.

1 В стек на уровне привилегий текущего сегмента кода помещаются:

 значения SSиSP, если уровень привилегий в коммутаторе выше уровня привилегий ранее исполнявшегося кода;

 регистр флагов EFLAGS;

 регистры CSиIP.

2 Если рассматриваемому прерыванию соответствовал коммутатор interrupt gate, то запрещаются прерывания (флагIF=0 в регистреEFLAGS). В случае коммутатораtrap gateфлаг прерываний не сбрасывается и обработка новых прерываний на период обработки текущего прерывания тем самым не запре­щается.

3Поле селектора из дескриптора прерываний используется для индексирова­ния таблицы дескрипторов задачи. Дескриптор сегмента заносится в теневой регистр, а смещение относительно начала нового сегмента кода определяется полем смещения из дескриптора прерывания.

Рис.3.13.Схема передачи управления при прерывании в контексте текущей задачи

Таким образом, в случае обработки прерываний, когда дескриптором прерыва­ний является коммутатор interrupt gateилиtrap gate, мы остаемся в том же вир­туальном адресном пространстве, и полной смены контекста текущей задачи не происходит. Просто мы переключаемся на исполнение другого (как правило, бо­лее привилегированного) кода, но также принадлежащего (или, правильнее сказать, доступного) исполняемой задаче. Этот код создается системными програм­мистами, и прикладные программисты его просто используют. В то же время механизмы защиты микропроцессора позволяют обеспечить недоступность этого кода для его исправления (со стороны приложений, его вызывающих) и недос­тупность самой таблицы дескрипторов прерываний. Удобнее всего код обработ­чиков прерываний располагать в общем адресном пространстве, то есть селекто­ры, указывающие на такой код, должны располагаться в глобальной таблице дескрипторов.

Обработка прерываний с переключением на новую задачу

Совершенно иначе осуществляется обработка прерываний в случае, если деск­риптором прерываний является коммутатор задачи. Формат коммутатора задачи (task gate) отличается от коммутаторовinterrupt gateиtrap gate, прежде всего, тем, что в нем вместо селектора сегмента кода, на который передаётся управле­ние, указывается селектор сегмента состояния задачи (TSS). Это иллюстрирует­ся с помощью рис.3.14. В результате осуществляется процедура перехода на но­вую задачу с полной сменой контекста, ибо сегмент состояния задачи полностью определяет новое виртуальное пространство и адрес начала программы, а теку­щее состояние прерываемой задачи аппаратно (по микропрограмме микропро­цессора) сохраняется в её собственном TSS.

При этом происходит полное переключение на новую задачу с вложением, то есть выполняются следующие действия:

1 Сохраняются все рабочие регистры процессора в текущем сегменте TSS, базо­вый адрес этого сегмента берется в регистре TR(см. раздел «Адресация в 32-разрядных микропроцессорахi80x86 при работе в защищённом режиме»).

2 Текущая задача отмечается как занятая.

3 По селектору из Task Gateвыбирается новый TSS (поле селектора помещается в регистр TR) и загружается состояние новой задачи. Напомним, что загру­жаются значения регистраLDTR,EFLAGS, восемь регистров общего назна­чения, указатель команды регистрEIPи шесть сегментных регистров.

4 Устанавливается бит NT(nexttask).

5 В поле обратной связи TSS помещается селектор прерванной задачи.

6ЗначенияCS:IP, взятые из нового TSS, позволяют найти и выполнить первую команду обработчика прерывания.

Рис.3.14.Схема передачи управления при прерывании с переключением на новую задачу

Таким образом, коммутатор task gateдаёт указание процессору произвести пере­ключение задачи, и обработка прерывания осуществляется под контролем отдельной внешней задачи. В каждом сегменте TSS имеется селектор локальной дескрипторной таблицыLDT, поэтому при переключении задачи процессор загружает в регистр LDTR новое значение. Это позволяет обратиться к сегментам кода, которые абсолютно не пересекаются с сегментами кода любых других за­дач, поскольку именно локальные дескрипторные таблицы обеспечивают эффек­тивное изолирование виртуальных адресных пространств. Новая задача начина­ет своё выполнение на уровне привилегий, определяемом полемRPLнового содержимого регистраCS, которое загружается из сегмента TSS. Достоинством этого коммутатора является то, что он позволяет сохранить все регистры процес­сора с помощью механизма переключения задач, тогда как коммутаторыtrap gateиinterrupt gateсохраняют только содержимое регистровIFLAGS,CSиIPи со­хранение других регистров возлагается на программиста, разрабатывающего со­ответствующую программу обработки прерывания.

Справедливости ради следует признать, что, несмотря на возможности коммута­тора task gate, разработчики современных операционных систем достаточно ред­ко его используют, поскольку переключение на другую задачу требует сущест­венно больших затрат времени, а полное сохранение всех рабочих регистров часто и не требуется. В основном обработку прерываний осуществляют в контексте те­кущей задачи, так как это приводит к меньшим накладным расходам и повышает быстродействие системы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]