Lab2. Защищенный режим микропроцессоров Intel x86. Лабораторная работа защищенный режим микропроцессоров intel x86 Основные сведения
Скачать 0.54 Mb.
|
Прерывание 0 - ошибка деления. Возникает в командах DIV или IDIV, если частное не помещается в отведенный регистр. Прерывание 1 - отладочные особые ситуации. Является ли данная особая ситуация сбоем или ловушкой, зависит от условия, как показано ниже: - сбой в контрольной точке адреса команды; - ловушка в контрольной точке адреса данных; - ловушка шага выполнения; - ловушка контрольной точки переключения задачи. Прерывание 2 - немаскируемое прерывание. Вызывается сигналом на входе NMI процессора. Прерывание 3 - точка останова. Генерируется командой INT3. Сохраненное содержимое регистров CS и EIP указывает на байт, следующий за контрольной точкой. Прерывание 4 - переполнение. Происходит, когда процессор выполняет команду INTO при установленном флаге OF. Прерывание 5 - проверка границ. Генерируется, когда при выполнении команды BOUND обнаруживается, что операнд превышает заданные границы. Прерывание 6 - неверный код операции. Генерируется, когда исполнительный модуль обнаруживает неверный код операции. Эта особая ситуация происходит также при неверном типе операнда для данного кода операции. Примером может служить команда межсегментного перехода JMP, использующая регистровый операнд. Третье условие генерации данной особой ситуации состоит в использовании префикса LOCK с командой, для которой захват шины невозможен. Прерывание 7 – сопроцессор недоступен. Генерируется в одном из следующих случаев: 1. Процессор выполняет команду ESC при установленном бите EM регистра CR0. 2. Процессор выполняет команду WAIT или ESC при установленном бите TS регистра CR0. Таким образом, прерывание 7 происходит, когда программист хочет, чтобы команда ESC обрабатывалась программно (EM=1), либо когда встречена команда WAIT или ESC, а контекст сопроцессора отличен от контекста для текущей задачи. Для процессоров 80286 и 80386 бит MP регистра CR0 используется с битом TS для определения того, должна ли команда WAIT генерировать особую ситуацию. Для программ, выполняемых на процессоре 80486, бит MP должен быть установлен всегда. Прерывание 8 - двойная ошибка. Обычно когда процессор обнаруживает особую ситуацию при попытке вызвать обработчик особой ситуации, происшедшей ранее, эти два прерывания могут обрабатываться последовательно. Однако, если процессор не в состоянии этого сделать, он генерирует особую ситуацию двойной ошибки. Процессор всегда помещает код ошибки в стек обработчика двойной ошибки, однако этот код всегда равен 0. Рестарт вызвавшей сбой команды невозможен. Если при попытке вызвать обработчик двойной ошибки произойдет еще одна особая ситуация, то процессор входит в режим останова системы. Никакие дальнейшие команды не выполняются до приема немаскируемого прерывания или сигнала сброса системы RESET. Процессор генерирует специальный цикл шины, указывающий на вхождение в режим останова. Прерывание 10 - неверный TSS. Генерируется при попытке переключения задачи на сегмент с неверным TSS. TSS является неверным в случаях, описанных в табл. П2. Код ошибки помещается в стек обработчика особой ситуации, что помогает идентифицировать причину сбоя. Чтобы гарантировать доступность TSS для обработки особой ситуации, обработчик прерывания типа "неверный TSS" должен вызываться как задача посредством шлюза задачи. Прерывание 11 - сегмент не присутствует. Генерируется, когда процессор обнаруживает, что бит присутствия в дескрипторе очищен. Данная ошибка позволяет выполнение рестарта. Обработчик особой ситуации загружает сегмент и прерванная программа продолжает выполнение. Прерывание 12 - особая ситуация при работе со стеком. Ошибка в стеке генерируется в следующих случаях: 1. В результате нарушения границы операцией, ссылающейся к регистру SS. Сюда входят стековые команды, такие как POP, PUSH, ENTER и LEAVE, а также ссылки к памяти, неявно использующие стек (например, MOV DX,[BP]). 2. При попытке загрузить регистр SS дескриптором, отмеченным признаком "сегмент не присутствует". Таблица П2 Условия неверного TSS ┌──────────────────┬──────────────────────────────────────────┐ │Индекс кода ошибки│ Описание │ ├──────────────────┼──────────────────────────────────────────┤ │ Сегмент TSS │Граница сегмента TSS меньше 67H │ │ Сегмент LDT │Неверная LDT или LDT не присутствует │ │ Сегмент стека │Селектор сегмента стека превышает границу │ │ │таблицы дескрипторов │ │ Сегмент стека │Сегмент стека не доступен для записи │ │ Сегмент стека │DPL сегмента стека не совместим с CPL │ │ Сегмент стека │RPL селектора сегмента стека не совместим │ │ │с CPL │ │ Сегмент кода │Селектор сегмента кода превышает границу │ │ │таблицы дескрипторов │ │ Сегмент кода │Сегмент кода не является выполняемым │ │ Сегмент кода │DPL неподчиненного сегмента кода │ │ │не равен CPL │ │ Сегмент кода │DPL подчиненного сегмента кода больше CPL│ │ Сегмент данных │Селектор сегмента данных превышает границу│ │ │таблицы дескрипторов │ │ Сегмент данных │Сегмент данных не доступен для чтения │ └──────────────────┴──────────────────────────────────────────┘ Прерывание 13 - общая защита. Генерируется для всех нарушений защиты, не вызывающих прочих особых ситуаций. Такими нарушениями могут быть: - превышение границы сегмента при использовании сегментов CS, DS, ES, FS или GS; - превышение границы сегмента при ссылке к таблице дескрипторов; - передача управления сегменту, не являющемуся кодовым; - попытка записи в сегмент данных, доступный только для чтения, или в кодовый сегмент; - чтение из кодового сегмента, доступного только для выполнения; - загрузка регистра SS селектором сегмента, доступного только для чтения; - загрузка регистра SS, DS, ES, FS или GS селектором системного сегмента; - загрузка регистра DS, ES, FS или GS селектором кодового сегмента, доступного только для выполнения; - загрузка регистра SS селектором выполняемого сегмента; - доступ к памяти при помощи регистров DS, ES, FS или GS, когда в них содержится пустой селектор; - переключение на занятую задачу; - нарушение правил привилегий; - превышение длины команды 15 байт; - загрузка регистра CR0 при установленном бите PG (трансляция страниц разрешена) и очищенном бите PE (защита запрещена). В реальном режиме это прерывание генерируется, если команда или операнд пересекают границу сегмента (0FFFFh) или длина команды превышает 15 байт. Прерывание 14 – страничная ошибка. Происходит, когда подкачка страниц разрешена (бит PG регистра CR0 установлен) и процессор обнаруживает одно из следующих условий во время трансляции линейного адреса в физический: - элемент каталога страниц или таблицы страниц, необходимый для трансляции адреса, имеет очищенный бит Присутствия, т.е. нужная таблица страниц или страница, содержащая операнд, не присутствует в физической памяти; - процедура не имеет достаточного уровня привилегий для доступа к указанной странице. Обработчик страничной ошибки получает информацию об ее причине из двух источников: 1. Код ошибки в стеке. Код ошибки для страничной особой ситуации имеет формат, отличный от формата для других особых ситуаций: 31 15 7 3 2 1 0 ┌──────────────────────────────┬─┬─┬─┬─┐ │ │R│U│W│ │ │ Не определены │S│/│/│P│ │ │W│S│R│ │ └──────────────────────────────┴─┴─┴─┴─┘ Назначение битов 0..3 кода ошибки приведено в табл. П3. 2. Содержимое регистра CR2. Процессор загружает в регистр CR2 32-разрядный линейный адрес, вызвавший ошибку. Таблица 3 Назначение битов 0..3 кода страничной ошибки ┌──────┬──────────┬───────────────────────────────────────────┐ │ Поле │Значение │ Описание │ ├──────┼─────────┼───────────────────────────────────────────┤ │ RSW │ 1 │ Сбой произошел из-за обнаружения единицы │ │ │ │ в одном из элементов таблицы или каталога│ │ │ │ страниц (ТОЛЬКО В ПРОЦЕССОРЕ PENTIUM) │ │ │ 0 │ В остальных случаях │ │ U/S │ 0 │ Cбой, произошел при работе процессора в │ │ │ │ в режиме супервизора │ │ │ 1 │ Сбой, произошел при работе процессора в │ │ │ │ в режиме пользователя │ │ W/R │ 0 │ Ошибка произошла при чтении │ │ │ 1 │ Ошибка произошла при записи │ │ P │ 0 │ Сбой был вызван отсутствием страницы │ │ │ 1 │ Сбой был вызван нарушением защиты │ │ │ │ на уровне страниц │ └──────┴────────┴───────────────────────────────────────────┘ Прерывание 16 - ошибка сопроцессора. Эта особая ситуация сигнализирует об ошибке, возникшей во время выполнения команды сопроцессором. Прерывание 16 может произойти только если бит NE регистра CR0 установлен. Прерывание 17 - контроль выравнивания. Генерируется при попытке доступа к не выравненным операндам. Для разрешения контроля выравнивания должны выполняться следующие условия: - бит AM регистра CR0 должен быть установлен; - флаг AC должен быть установлен; - CPL должен быть равен 3 (уровень пользователя). Требования к выравниванию по типам данных приведены в табл. П4. Таблица 4 Требования к выравниванию данных ┌────────────────────────────────────────┬───────── ────┐ │ Тип данных │ Адрес должен │ │ │ быть кратен │ ├────────────────────────────────────────┼─────── ──────┤ │Слово │ 2 │ │Двойное слово │ 4 │ │Короткое вещественное (32 бита) │ 4 │ │Длинное вещественное (64 бита) │ 8 │ │Временное вещественное (80 бит) │ 8 │ │Селектор │ 2 │ │48-разрядный сегментированный указатель │ 4 │ │32-разрядный плоский указатель │ 4 │ │32-разрядный сегментированный указатель │ 2 │ │48-разрядный псевдодескриптор │ 4 │ │Область хранения FSTENV/FLDENV │4 или 2, в │ │ │зависимости от │ │ │размера операнда│ │Область хранения FSAVE/FRSTOR │4 или 2, в │ │ │зависимости от │ │ │размера операнда│ │Битовая строка │ 4 │ └────────────────────────────────────────┴───────────────┘ Нарушения контроля выравнивания генерируются только в режиме пользователя (уровень привилегий 3). Обращения к памяти, которые по умолчанию относятся к уровню привилегий 0, например загрузка дескриптора сегмента, не формируют нарушений контроля выравнивания. Аппаратные прерывания и особые случаи распознаются на границах команд. При этом процессор производит следующую последовательность проверок: 1. Проверка особого случая отладки (по флажку TF или контрольной точке по данным, установленной в регистрах отладки). Формирование этого особого случая, если удовлетворяются условия его возникновения. 2. Проверка внешнего сигнала на входе немаскируемого прерывания NMI и при его активном состоянии формирование прерывания с номером 2. 3. Проверка внешнего сигнала на входе маскируемого прерывания INTR и при его активном состоянии (и флажке IF = 1) выполнение двух циклов шины подтверждения прерывания, ввод номера прерывания и обработка этого прерывания. 4. Проверка особого случая отладки (контрольная точка по команде, установленная в регистрах отладки). 5. Проверка нарушений доступа к сегменту, которые могут возникнуть при выборке следующей команды, и при необходимости формирование особого случая 11 или 13. 6. Проверка страничного нарушения, которое может появиться при выборке следующей команды. При обнаружении страничного нарушения формирование особого случая 14. 7. Проверка нарушений, которые могут появиться при декодировании следующей команды (недействительный код операции, превышение длины команды или нарушение защиты по привилегиям). 8. Проверка каждого обращения к памяти, инициируемого командой: при наличии нарушения сегмента, препятствующего передаче операнда, формирование особого случая 11, 12 или 13; при наличии страничного нарушения - особого случая 14. |