В вычислениях x86 нереальный режим , также большой реальный режим , плоский реальный режим или режим вуду [1] является вариантом реального режима , в котором один или несколько дескрипторов сегментов загружены нестандартными значениями , такими как 32-битные ограничения, позволяющие получить доступ ко всей памяти. Вопреки своему названию, это не отдельный режим адресации, в котором могут работать процессоры x86. Он используется в процессорах 80286 и более поздних процессорах x86.
В целях эффективности процессоры 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 , который несовместим с нереальным режимом.
Одной из немногих игр — если не единственной — которая использовала режим Unreal Mode, была Ultima VII . [6] [7]
Нереальный режим используется кодом BIOS , поскольку это начальный режим современных процессоров Intel. [8] Кроме того, режим управления системой (SMM) в процессорах Intel 386SL и более поздних версиях переводит процессор в огромный реальный режим. [9]
Некоторые загрузчики (например, LILO ) используют нереальный режим для доступа к памяти объемом до 4 ГиБ.
Микропроцессор 80286 можно перевести в нереальный режим только с помощью недокументированной инструкции LOADALL для изменения базовых регистров скрытого сегмента, чтобы они указывали на исходную или целевую ячейку памяти свыше 1 МБ. [5]
Чтобы перевести микропроцессор 80386 или выше в нереальный режим, программа должна сначала войти в защищенный режим , найти или создать плоский дескриптор в GDT или LDT , загрузить некоторые регистры сегмента данных с соответствующим «селектором» защищенного режима, а затем переключиться обратно в реальный режим. После возврата в реальный режим процессор продолжит использовать кэшированные дескрипторы, как установлено в защищенном режиме, тем самым обеспечивая доступ к 4 ГиБ расширенной памяти из реального режима. [4]
Начиная с 80386, программы реального режима могут использовать 32-битные регистры с префиксом переопределения размера адреса. [10] Это позволяет программам использовать адрес типа DS:[EBX]. В обычном реальном режиме возникает ошибка, если EBX превышает 0xFFFF. В нереальном режиме доступ разрешен.
Как описано выше, нереальный режим обычно включает использование одного или нескольких селекторов данных для более эффективного обращения к данным в памяти. Это было обычной практикой и часто называлось «плоским реальным режимом» [11] или «большим реальным режимом». [12] Термин «нереальный режим» был введен в 1991 году Ракешем К. Агарвалом. [13]
«Огромный реальный режим» (названный в списке прерываний Ральфа Брауна) или режим «unREAL» (названный Томашем Грыстара) добавляет возможность запускать 32-битный код с сегментом кода 4 ГиБ. Это достигается за счет загрузки селектора кода (CS) из дескриптора, имеющего 32-битный атрибут (бит «D»), установленный в 1. Этот режим позволяет избегать префиксов переопределения размера операнда, обычно требуемых при использовании 32-битной адресации в 16-битном сегменте кода, но его сложнее настроить из-за взаимодействия с прерываниями. [14] [4]
Использование 32-битного CS было описано в статье Агарвала 1991 года, вводящей термин «нереальный режим». [13] Этот режим используется в FASM с открытым исходным кодом Грыстар и Helix RM386, коммерческом DOS Extender, связанном с драйверами мыши Logitech. Грыстар написал описание методов, используемых для входа в этот режим и обработки прерываний в 2010 году. Он также сообщает, что большинство протестированных им ЦП поддерживают этот ранее неизвестный режим, за исключением ЦП неизвестной модели («Я думаю, что он был произведен Cyrix ») и, в более позднем пользовательском отчете, эмуляторов Bochs и DOSBox . [15]
[…] Режим Unreal стал настолько широко использоваться […], что Intel была вынуждена поддерживать его во всех более поздних процессорах, хотя его наличие никогда не было задокументировано […]
Процессор загружает архитектурно определенное состояние системы "Unreal" mode