Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Шпоры по ассемблеру, 1ый семестр (Гончаревич А Л) [3131 вопросов] / шпоры-1 / 27-Переключение МП из реального режима в защищенный и обратно

..docx
Скачиваний:
48
Добавлен:
15.06.2014
Размер:
28.95 Кб
Скачать

27-Переключение МП из реального режима в защищенный и обратно.

Переключения из реального режима в защищенный происходит программно и относительно просто, однако для обратного перехода требуется аппаратный сброс процессора. Для отслеживания текущего режима работы процессора используется регистр слово состояния машины (MSW). Программы реального режима без модификаций в защищенном режиме использоваться не могут, равно как и программы BIOS машины.Переход кзащищенного режима осуществляется программно с помощью выполнения соответствующей последовательности команд. Программы, предназначенные для защищенного режима, должны быть написаны особым образом. Это означает, что реальный и защищенный режимы не совместимы.Процессор переходит в этот режим, когда бит PE в регистре cr0 устанавливается в единицу. Установить этот бит можно командами mov cr0 , r 32  или командой lmsw r16/m16 Последняя команда загружает из памяти или 16-разрядного регистра младшую половину регистра cr0. Обе команды доступны в реальном режиме.

После перехода в защищенный режим МП ожидает наличия в памяти по крайней мере двух таблиц: GDT и IDT. Поэтому эти таблицы должны быть созданы заранее ещё в реальном режиме, например, с помощью ассемблерных директив dbdw иdd. Что касается LDT, то её (их) можно создать как заранее в реальном режиме, так и позднее, когда мы уже находимся в защищенном режиме. Зачастую LDT вообще не создаются.

В общем случае переключение в защищенный режим требует серьезной подготовительной работы со стороны программиста, который должен выполнить примерно следующую последовательность действий.

1. Создать в памяти таблицы GDT и IDT.

2. Запретить внешние прерывания, в том числе и по входу NMI (если последний в системе используется). Связано это с тем, что в процессе переключения есть временной интервал, когда таблица векторов прерываний реального режима уже не действует, а таблица IDT ещё не действует. Если на этом интервале МП воспримет любое прерывание, наступит крах системы.

3. Перенастроить контроллеры прерываний на новые типы (номера) прерываний, с тем чтобы исключить конфликты между внутренними и внешними прерыва-ниями. Этот пункт не имеет никакого отношения к самому МП, а связан с особенностями функционирования IBM-подобных ПЭВМ. Когда фирма Intel выпустила МП 8086, она заняла под внутренние прерывания типы 0 ‑ 4, но предупредила, что типы 5 ‑ 31 резервируются для внутрен-них прерываний будущих процессоров. По каким-то причинам фирма IBM это предупреждение проигнори-ровала и отвела типы 8 ‑ 15 внешним прерываниям. В результате, например, тип 8 присвоен внешнему прерыванию от таймера (этот тип выдает на МП контроллер прерываний) и одновременно в 32-разрядных МП этот тип отведен особому случаю (внутреннему прерыванию) «двойная ошибка». Получается конфликт, так как МП не знает, какой обработчик он должен выполнять.

4. Открыть линию А20 (если она была закрыта).

5. Во внутренние регистры процессора gdtr и idtr загрузить начальные адреса и размеры таблиц GDT и IDT.

6. Установить бит РЕ. С этого момента мы в защищенном режиме.

7. Обычно первой командой в защищенном режиме ставится команда jmp far next(дальний переход на следующую команду программы). Команда очищает очередь команд от команд защищенного режима, а также заносит в видимую часть csправильный селектор, по которому в дескрипторной таблице GDT отыскивается дескриптор сегмента кода. Далее этот дескриптор копи-руется в теневую часть cs. Очистка очереди команд нужна исходя из следующих соображений. Во всех рассматриваемых процессорах реализован конвейер команд. В любой момент времени внутри процессора обрабатывается сразу несколько команд, находящихся на разных стадиях выполнения. Отсюда, при переключении режимов возникает ситуация, когда с конвейера еще сходят команды одного режима, а на конвейер уже поступают команды другого режима. Поскольку в разных режимах одни и те же команды выполняются по-разному, такая ситуация иногда может приводить к различным коллизиям. Использование команды jmp снимает эту проблему. Начиная с Pentium, использование команды jmp для рассмотренной выше цели необязательно, поскольку команды, меняющие содержимое регистров управленияcr0-cr4, гарантируют, что все команды, идущие перед ними, будут завершены (так называемые «сериалайзд» ‑ команды – serialized instruction).

8. Разрешить внешние прерывания.

Не следует считать, что все эти пункты всегда обязательны к исполнению. Это только общая схема действий, причем подразумевающая, что мы переключаемся в защищенный режим «всерьёз и надолго». Если же требуется только «нырнуть» в защищенный режим и тут же вернуться обратно, то многие пункты можно исключить. В частности, можно не создавать IDT, не загружать IDTR, и вообще не выполнять пп. 3,4 и 7.

Вернуться в режим реального адреса процессор может по сигналу RESET или (в отличие от 80286) сбросив бит PE:

MOV EAX,00000000h

MOV CR0,EAX

Для совместимости с 80286 инструкция LMSW бит PE не сбрасывает.