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, обычно работают без проблем.

Примечания

  1. Riiser, Haakon HIMEM.SYS and unreal/flat real mode, EMM386 and UMBs. comp.os.msdos.programmer. Дата обращения: 14 октября 2017. Архивировано 7 декабря 2019 года.
  2. https://www.blackhat.com/docs/us-15/materials/us-15-Domas-The-Memory-Sinkhole-Unleashing-An-x86-Design-Flaw-Allowing-Universal-Privilege-Escalation.pdf Архивная копия от 5 января 2017 на Wayback Machine «The processor loads an architecturally defined system state „Unreal“ mode»
  3. Gutmann, Cryptographic Security Architecture: Design and Verification Архивная копия от 10 марта 2016 на Wayback Machine, 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»
  4. The Unabridged Pentium 4 IA32 Processor Genealogy, Addison Wesley ISBN 0-321-24656-X. «Big real mode»

Ссылки

Литература

  • The Unabridged Pentium 4 IA32 Processor Genealogy, Addison Wesley ISBN 0-321-24656-X. «Big real mode»