В вычислениях x86 нереальный режим , а также большой реальный режим , плоский реальный режим или режим вуду [1] — это вариант реального режима , в котором один или несколько дескрипторов сегментов загружаются с нестандартными значениями, такими как 32-битные ограничения. позволяющий получить доступ ко всей памяти. Вопреки названию, это не отдельный режим адресации, в котором могут работать процессоры x86. Он используется в процессорах x86 80286 и более поздних версиях.
По соображениям эффективности процессоры 80286 и все более поздние версии процессоров x86 используют базовый адрес, размер и другие атрибуты, хранящиеся в их внутреннем кэше дескрипторов сегментов , при вычислении эффективных адресов памяти, даже в реальном режиме. Таким образом, модификация внутреннего дескриптора сегмента позволяет изменить некоторые свойства сегментов в реальном режиме, например размер адресуемой памяти. Этот метод получил широкое распространение и поддерживается всеми процессорами Intel. [2]
Программа в нереальном режиме может без каких-либо преобразований вызывать 16-битный код, запрограммированный для реального режима (BIOS, ядро DOS и драйверы) . Это делает драйвер нереального режима проще, чем драйвер DPMI . Однако нереальный режим несовместим с операционными системами защищенного режима, такими как Windows 3.x/9x/NT и OS/2.
Большой реальный режим имеет сегмент кода размером 1 МБ и сегмент данных размером 4 ГБ. [3] [4]
HIMEM.SYS использует эту функцию (как 286, так и 386 варианты) для адресации расширенной памяти , [5] если только DOS не переключен на работу в виртуальном режиме 8086 , несовместимом с нереальным режимом.
Одной из очень немногих игр (если не единственной), в которой использовался нереальный режим, была Ultima VII . [6] [7]
Режим Unreal используется кодом BIOS , поскольку это начальный режим современных процессоров Intel. [8] Кроме того, режим управления системой (SMM) в процессорах Intel 386SL и более поздних версиях переводит процессор в огромный реальный режим. [9]
Некоторые загрузчики (например, LILO ) используют режим unreal для доступа к памяти до 4 ГиБ.
Микропроцессор 80286 можно перевести в нереальный режим только с помощью недокументированной инструкции LOADALL, которая модифицирует базовые регистры скрытого сегмента, чтобы они указывали на исходную или целевую ячейку памяти размером более 1 МБ. [5]
Чтобы перевести микропроцессор 80386 или выше в нереальный режим, программа должна сначала войти в защищенный режим , найти или создать плоский дескриптор в GDT или LDT , загрузить некоторые регистры сегментов данных соответствующим «селектором» защищенного режима, а затем переключиться вернуться в реальный режим. После возвращения в реальный режим процессор продолжит использовать кэшированные дескрипторы, установленные в защищенном режиме, что позволяет получить доступ к 4 ГиБ расширенной памяти из реального режима. [4]
Начиная с 80386, программы реального режима могут использовать 32-битные регистры с префиксом замены размера адреса. [10] Это позволяет программам использовать адрес типа DS:[EBX]. В обычном реальном режиме возникает ошибка, если EBX превышает 0xFFFF. В нереальном режиме доступ разрешен.
Как описано выше, нереальный режим обычно предполагает использование одного или нескольких селекторов данных для более эффективной адресации данных в памяти. Это обычная практика, которую часто называют «плоским реальным режимом» [11] или «большим реальным режимом». [12] Термин «нереальный режим» был введен в 1991 году Ракешем К. Агарвалом. [13]
«Огромный реальный режим» (названный в списке прерываний Ральфа Брауна) или «неРЕАЛЬНЫЙ» режим (названный Томашем Грыштаром) добавляет возможность запуска 32-битного кода с сегментом кода размером 4 ГиБ. Это достигается путем загрузки селектора кода (CS) из дескриптора, 32-битный атрибут которого (бит D) установлен в 1. Этот режим позволяет избежать префиксов переопределения размера операнда, которые обычно требуются при использовании 32-битной адресации в 16-битном формате. сегмент битового кода, но его сложнее настроить из-за взаимодействия с прерываниями. [14] [4]
Использование 32-битной CS было описано в статье Агарвала 1991 года, в которой был введен термин «нереальный режим». [13] Этот режим используется в FASM с открытым исходным кодом Grysztar и Helix RM386, коммерческом расширителе DOS, поставляемом в комплекте с драйверами мыши Logitech. Гриштар написал описание методов, используемых для входа в этот режим и обработки прерываний в 2010 году. Он также сообщает, что большинство протестированных им процессоров поддерживают этот ранее неизвестный режим, за исключением процессора неизвестной модели («Я думаю, что он был изготовлен by Cyrix »), а в более позднем отчете пользователя — эмуляторы Bochs и DOSBox . [15]
[…] Режим Unreal стал настолько широко использоваться […], что Intel была вынуждена поддерживать его во всех более поздних процессорах, хотя его присутствие никогда не было задокументировано […]
Процессор загружает архитектурно определенное состояние системы в режиме «Unreal».