Русская Википедия:Unreal mode
Unreal mode (иногда также Big Real Mode, 32 bit Real Mode, Flat Real Mode) — метод, с помощью которого реализуется возможность из реального режима работы процессора Intel 80386 и выше адресовать до 4 гигабайт памяти, вместо 1 мегабайта, доступного в реальном режиме. Вопреки названию, данный метод не является режимом работы процессора.
Активно использовался в некоторых приложениях MS-DOS в начале 1990-х годов, в том числе, некоторых играх (например, в Ultima VII[1]). Также используется при исполнении кода SMM[2].
Из-за большой популярности режима компании Intel пришлось поддерживать его в последующих процессорах, хотя он и оставался недокументированным[3].
Описание
Ядро MS-DOS исполняется в 16-битном режиме процессора, реальном или же V86.
Чтобы снять ограничение по размеру адресного пространства в 1 МиБ (налагаемым 16-битной адресацией реального режима процессора), необходим защищённый режим (при этом доступными становятся 16 МиБ ОЗУ, чтобы получить больший объём — до 4 ГиБ, необходим 32-битный защищённый режим, появившийся в процессорах 80386).
Таким образом, для разработки программ под DOS, требующих большой объём памяти, приходилось либо программировать в защищённом режиме и использовать расширитель DOS и DPMI (так написан, например, Doom), либо же использовать недокументированную возможность процессора. Разработка в защищённом режиме требовала использования всего пакета инструментов и отладчика, рассчитанного на это, и обычно связанного с конкретным расширителем DOS. Такие пакеты были дороги, не так популярны, как обычные среды разработчиков под DOS, и потому часто от их использования отказывались. Недокументированная возможность позволяла использовать всю память из приложения, разработанного в обычной среде разработки под DOS, например, Borland C++.
Эта возможность состоит в том, что можно кратковременно войти в 32-битный защищенный режим, загрузить там дескрипторы сегментов с границами, превышающими 64К, и потом выйти обратно в 16-битный реальный режим. При выходе сохраняется значение границы, превышающее 64К, граница не сбрасывается при выходе сама. После этого можно, применяя явно написанные на ассемблере 32-битные команды, обращаться ко всей памяти машины напрямую, относительно сегмента с «неправильной» границей.
Возможность подобной адресации напрямую следует из технических спецификаций 80386, в котором появились две необходимые для этого возможности. Первая — документированный переход из защищенного режима в реальный путём сброса флага PE в регистре CR0 (его предшественник, 80286, игнорировал попытки сбросить данный флаг в своей 16-битной версии CR0, называвшейся MSW). Вторая — возможность установить размер сегмента равным размеру всего доступного физического адресного пространства (из-за того, что разрядность регистров сравнялась с разрядностью шины адреса).
Наличие «теневых регистров» для кеширования характеристик сегментов, связанных с сегментными регистрами, и позволяющих «запомнить» то состояние сегментного регистра, которое было установлено в защищенном режиме, даже после перехода назад в реальный, было документировано ещё для 80286, в котором они также могут быть использованы (на этот раз — действительно недокументированным способом) для доступа ко всей физической памяти из реального режима, однако не в виде линейной адресации, как в 80386, а через «окна»-сегменты размером 64 КБ.
Ограничения
Этот метод невозможно использовать для адресации кода или стека[4], ни в каких многозадачных средах на основе DOS и в «Virtual 8086»-окне операционной системы Windows, в том числе в NTVDM. Более того, Unreal mode несовместим с EMM386 — последний работает, создавая единственную виртуальную машину режима V86 и помещая в неё весь DOS. Полноценные виртуальные машины, такие, как Virtual PC и VMware Workstation, обычно работают без проблем.
Примечания
Ссылки
Литература
- The Unabridged Pentium 4 IA32 Processor Genealogy, Addison Wesley ISBN 0-321-24656-X. «Big real mode»
- ↑ Шаблон:Cite web
- ↑ https://www.blackhat.com/docs/us-15/materials/us-15-Domas-The-Memory-Sinkhole-Unleashing-An-x86-Design-Flaw-Allowing-Universal-Privilege-Escalation.pdf Шаблон:Wayback «The processor loads an architecturally defined system state „Unreal“ mode»
- ↑ Gutmann, Cryptographic Security Architecture: Design and Verification Шаблон:Wayback, 2004, ISBN 9780387953878, page 58 «Unreal mode became so widely used… that Itnel was forced to support it in all later processors, although its presence was never documented»
- ↑ The Unabridged Pentium 4 IA32 Processor Genealogy, Addison Wesley ISBN 0-321-24656-X. «Big real mode»