Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Структура дескриптора таблицы IDT
63 47 39 36 32
31 15 0 Рис. 7.1 Поле type для шлюза ловушки – 1111, шлюза прерывания – 1110, шлюза задачи – 0101. Для шлюза задачи биты с 0 по 15 и с 48 по 63 не используются. Поле indicator представляет селектор одной из таблиц, GDT или LDT, в зависимости от состояния бита TI в нем. Поле offset определяет смещение в сегменте кода. Этот сегмент описывается дескриптором, на который указывает селектор в поле indicator. Если дескриптор описывает шлюз ловушки, то после того как управление будет передано обработчику прерывания, обработчик будет выполнять свою работу до тех пор, пока не встретит команду iret. Эта команда восстанавливает из стека состояние регистров eflags, cs и eip на момент возникновения прерывания, и работа приостановленной программы продолжается. При подготовке выхода из программы обработки, следует учитывать, что команда iret не извлекает, возможно сохраненный код ошибки из стека. Поэтому при возврате управления, необходимо удалить код ошибки из стека командой pop (если он там есть). При возникновении прерывания, которому соответствует шлюз прерывания, микропроцессор выполняет те же действия, что и для шлюза ловушки, но с одним отличием. Когда микропроцессор передает управление обработчику прерывания через шлюз прерывания, то он сбрасывает флаг прерывания в регистре eflags в ноль, запрещая тем самым обработку аппаратных прерываний. Когда микропроцессор при выполнении прерывания встречает в таблице IDT шлюз задачи, то это означает, что он должен осуществить переход на особый объект – задачу, которая будет осуществлять обработку прерывания. При этом состояние старой задачи, т.е. содержимое всех, связанных с этой задачей регистров сохраняется в сегменте состояния задачи – TSS. Поле indicator в шлюзе задачи содержит селектор, который определяет местонахождения дескриптора сегмента TSS – в таблице GDT или LDT (в зависимости от состояния бита TI селектора). В общем случае для того, чтобы сделать возможным обработку прерываний в защищенном режиме, необходимо выполнить следующие действия: - инициализировать таблицу IDT; - составить процедуры обработчиков прерываний; - запретить аппаратные прерывания; - перепрограммировать контроллер прерываний i8259A; - загрузить регистр idtr адресом и размером таблицы IDT; - перейти в защищенный режим; - разрешить обработку прерываний Далее микропроцессор, находясь в защищенном режиме, может производить обработку необходимых прерываний. По окончании работы для перехода в реальный режим нужнобудет выполнить следующие действия: - запретить аппаратные прерывания; - выполнить обратное перепрограммирование контроллера прерываний; - перейти в реальный режим работы микропроцессора; - разрешить обработку аппаратных прерываний. Для формирования таблицы IDT в целом, необходимо определиться с написанием отдельных ее дескрипторов – шлюзов. Для описания дескриптора таблицы IDT можно использовать шаблон в виде структуры: Descr_idt struc Offs_1 dw 0; - младшая часть адреса смещения обработчика прерывания Sel dw 30h; селектор на сегмент команд в таблице GDT No_use db 0 Type_attr db 8eh; по умолчанию шлюз прерывания ; для ловушки – 8fh Offs_2 dw 0; старшая часть адреса смещения обработчика прерывания Ends
После описания дескриптора таблицы IDT, можно приступать к формированию самой таблицы. Это можно делать как в отдельном сегменте, так и в сегменте данных. Но лучше, чтобы не загромождать сегмент данных, оформлять таблицу IDT в виде отдельного сегмента.
idt_seg segment para public 'data' use16 int00h descr_idt < dummy,,,, > REPT 2 descr_idt < dummy,,,, > ENDM int03h descr_idt < int_03h,,,, > descr_idt < dummy,,,, > int05h descr_idt < int_05h,,,, > REPT 7 descr_idt < dummy_err,,,, > ENDM int0dh descr_idt < int_0dh,,,, > REPT 3 descr_idt < dummy,,,, > ENDM int11h descr_idt < dummy_err,,,, > REPT 14 descr_idt < dummy,,,, > ENDM int20h descr_idt < new_08h,,,, > int21h descr_idt < sirena, 38h,,, > REPT 222 descr_idt < dummy,,,, > ENDM idt_size=$-int00h-1 idt_seg ends В этом сегменте полностью описана таблица прерываний. При этом все дескрипторы инициализированы именем процедур обработки прерываний. Основная часть дескрипторов имеет в качестве обработчика процедуру dummy, т.е. они будут обрабатываться одной программой. Для некоторых прерываний введены уникальные имена; эти прерывания должны иметь свои процедуры обработки в программе. Расположение и порядок следования процедур обработки прерывания в памяти может быть произвольным. Обязательным является только помещение их адресов в соответствующие дескрипторы. Аналогично таблице GDT, нужно сообщить микропроцессору, где располагается таблица IDT. Загрузка регистра idtr осуществляется по команде lidt. 7.3 Программа работы Перейти в защищенный режим работы микропроцессора и выполнить в зависимости от варианта задания из 6 лабораторной работы.
Вопросы к защите Формат регистра idtr. Виды исключений - отказ (fault), ловушка (trap), аварийное завершение (abort). Распределение исключений защищенного режима. Формат кода ошибки. Формат дескриптора шлюза. Упрощенная внутренняя структура ПКП i8259a. Режимы работы ПКП. Формат управляющих слов инициализации ICW1, ICW2, ICW3, ICW4. Формат операционных управляющих слов OCW1, OCW2, OCW3. Упрощенная схема обработки аппаратных прерываний в ВМ c процессорами Intel семейства х86.
|