Unreal modeUnreal 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, обычно работают без проблем. Примечания
Ссылки
Литература
|