stringtranslate.com

Нереальный режим

В вычислениях 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-битный код

«Огромный реальный режим» (названный в списке прерываний Ральфа Брауна) или «неРЕАЛЬНЫЙ» режим (названный Томашем Грыштаром) добавляет возможность запуска 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]

Смотрите также

Рекомендации

  1. ^ Салихун, Дармаван (16 сентября 2013 г.). «Инициализация карты системных адресов в архитектуре x86/x64, часть 1: системы на базе PCI» (PDF) . Проверено 19 августа 2019 г.
  2. ^ Гутманн, Питер (2004) [2003]. Архитектура криптографической безопасности: проектирование и проверка. Springer Science & Business Media . п. 58. ИСБН 978-0-387-95387-8. Проверено 4 января 2017 г. […] Режим Unreal стал настолько широко использоваться […], что Intel была вынуждена поддерживать его во всех более поздних процессорах, хотя его присутствие никогда не было задокументировано […]
  3. ^ «График режимов». Архивировано из оригинала (JPG) 18 января 2023 г.
  4. ^ abc «Нереальный режим». Архивировано из оригинала 3 января 2017 г. Проверено 18 февраля 2015 г.
  5. ^ аб Некасек, Михал (18 марта 2011 г.). «HIMEM.SYS, нереальный режим и LOADALL». Музей OS/2 . Архивировано из оригинала 3 января 2017 г. Проверено 03 января 2017 г.
  6. ^ Рисер, Хокон. «HIMEM.SYS и нереальный/плоский реальный режим, EMM386 и UMB». Группа новостей : comp.os.msdos.programmer. Архивировано из оригинала 21 апреля 2019 г. Проверено 14 октября 2017 г.
  7. ^ «Краткая история Unreal Mode | Музей OS / 2» .
  8. ^ Пелнер, Дженни; Пелнер, Джеймс. «Минимальный загрузчик архитектуры Intel» . Проверено 14 октября 2017 г.
  9. ^ Домас, Кристофер (2015). «Воронка памяти: уязвимость архитектурного повышения привилегий» (PDF) . Мемориальный институт Баттель. Архивировано (PDF) из оригинала 5 января 2017 г. Проверено 4 января 2017 г. Процессор загружает архитектурно определенное состояние системы в режиме «Unreal».
  10. ^ «Кодирование инструкций X86-64» . Архивировано из оригинала 3 января 2017 г. Проверено 18 февраля 2015 г.
  11. ^ «Плоский реальный режим». 16 марта 1998 г. Архивировано из оригинала 18 августа 2015 г.
  12. ^ Браун, Ральф Д. «Список прерываний». ИНТ 80 (АМИ БИОС) . Проверено 14 октября 2017 г.
  13. ^ аб Некасек, Михал (15 июня 2018 г.). «Краткая история Unreal Mode». Музей OS/2 .
  14. ^ Браун, Ральф Д. «Список прерываний». INT 78 (драйвер HugeRealMode) . Проверено 14 октября 2017 г.
  15. ^ Грыштар, Томаш (17 сентября 2010 г.). «НЕРЕАЛЬНЫЙ режим» . Проверено 14 октября 2017 г.

дальнейшее чтение