Нереальный режим - Unreal mode

В x86 вычислениях , нереален режим , а также большой реальный режим , огромный реальный режим , плоский реальный режим , или режим вуд представляет собой вариант реального режима , в котором один или несколько дескрипторах сегментов были загружены с нестандартными значениями, как 32-бит ограничения, разрешающие доступ ко всей памяти. Вопреки своему названию, это не отдельный режим адресации, в котором могут работать процессоры x86. Он используется в процессорах 80286 и более поздних версиях.

Обзор

Из соображений эффективности 80286 и все более поздние процессоры x86 используют базовый адрес, размер и другие атрибуты, хранящиеся в их внутреннем кэше дескрипторов сегментов, при вычислении эффективных адресов памяти, даже в реальном режиме. Поэтому модификация внутреннего дескриптора сегмента позволяет изменять некоторые свойства сегментов в реальном режиме, например, размер адресуемой памяти. Этот метод получил широкое распространение и поддерживается всеми процессорами Intel.

HIMEM.SYS использует эту функцию для адресации расширенной памяти , если DOS не переключен на работу в виртуальном режиме 8086, который несовместим с нереальным режимом.

Одной из очень немногих игр - если не единственной - в которой использовался нереальный режим, была Ultima VII .

В коде BIOS используется режим Unreal, так как это начальный режим современных процессоров Intel. Кроме того, режим управления системой (SMM) в процессорах Intel 386SL и более поздних версиях переводит процессор в огромный реальный режим.

Программа в нереальном режиме может вызывать 16-битный код, запрограммированный для реального режима (BIOS, ядро ​​DOS и драйверы), без каких-либо переходов . Это делает драйвер нереального режима проще, чем драйвер DPMI . Однако нереальный режим несовместим с операционными системами с защищенным режимом, такими как Windows 3.x / 9x / NT и OS / 2.

Большой реальный режим имеет сегмент кода 1 МБ и сегмент данных 4 ГБ.

Некоторые загрузчики (например, LILO ) используют нереальный режим для доступа к 4 ГБ памяти.

Включение нереального режима

Чтобы перевести микропроцессор 80386 или выше в нереальный режим, программа должна сначала войти в защищенный режим , найти или создать плоский дескриптор в GDT или LDT , загрузить некоторые из регистров сегмента данных с помощью соответствующего «селектора» защищенного режима, а затем переключить вернуться в реальный режим. После возврата в реальный режим процессор продолжит использовать кэшированные дескрипторы, установленные в защищенном режиме, что позволит получить доступ к 4 ГиБ расширенной памяти из реального режима.

Микропроцессор 80286 может быть переведен в нереальный режим только с помощью недокументированной инструкции LOADALL для изменения базовых регистров скрытых сегментов, чтобы они указывали на исходную или целевую ячейку памяти выше 1 МиБ.

Начиная с 80386, программы реального режима могут использовать 32-битные регистры с префиксом переопределения размера адреса. Это позволяет программам использовать адрес типа DS: [EBX]. В нормальном реальном режиме ошибка возникает, если EBX превышает 0xFFFF. В нереальном режиме доступ разрешен.

Варианты нереального режима

Как описано выше, нереальный режим обычно включает использование одного или нескольких селекторов данных для более эффективной адресации данных в памяти. Это было обычной практикой и часто упоминалось как «плоский реальный режим» или «большой реальный режим». «Огромный реальный режим» - это вариант, в котором сегмент кода также расширен до 4 ГиБ.

Особый случай нереального режима достигается, кроме того, загрузкой селектора кода (CS) из дескриптора, имеющего 32-битный атрибут (бит «D»), установленный в единицу. Этот редко используемый вариант дает некоторые преимущества, главным образом потому, что он позволяет избежать префиксов замены размера операнда, которые обычно требуются при использовании 32-битной адресации в 16-битном сегменте кода, но его сложнее настроить. Поскольку прерывания реального режима не сохраняют автоматически старшие шестнадцать битов расширенного указателя команд (EIP), код должен либо соответствовать младшей части сегмента кода, либо иметь возможность каким-либо образом сохранять и восстанавливать старшие биты EIP. Кроме того, если должны быть вызваны функции прерывания BIOS или DOS, использующие 16-битный код, для переключения бита «D» вперед и назад требуется переключение режима. Некоторые эмуляторы не поддерживают эмуляцию программ, работающих в этом варианте нереального режима.

Смотрите также

использованная литература

дальнейшее чтение