stringtranslate.com

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

В вычислениях 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]

32-битный код

«Огромный реальный режим» (названный в списке прерываний Ральфа Брауна) или режим «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]

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

Ссылки

  1. ^ Салихун, Дармаван (2013-09-16). "Инициализация карты системных адресов в архитектуре x86/x64. Часть 1: системы на базе PCI" (PDF) . Получено 2019-08-19 .
  2. ^ Гутманн, Питер (2004) [2003]. Архитектура криптографической безопасности: проектирование и проверка. Springer Science & Business Media . стр. 58. ISBN 978-0-387-95387-8. Получено 04.01.2017 . […] Режим Unreal стал настолько широко использоваться […], что Intel была вынуждена поддерживать его во всех более поздних процессорах, хотя его наличие никогда не было задокументировано […]
  3. ^ "График режимов". Архивировано из оригинала (JPG) 18.01.2023.
  4. ^ abc "Unreal Mode". Архивировано из оригинала 2017-01-03 . Получено 2015-02-18 .
  5. ^ ab Necasek, Michal (2011-03-18). "HIMEM.SYS, unreal mode и LOADALL". Музей OS/2 . Архивировано из оригинала 2017-01-03 . Получено 2017-01-03 .
  6. ^ Riiser, Haakon. "HIMEM.SYS и unreal/flat real mode, EMM386 и UMBs". Группа новостей : comp.os.msdos.programmer. Архивировано из оригинала 21.04.2019 . Получено 14.10.2017 .
  7. ^ «Краткая история Unreal Mode | Музей OS/2».
  8. ^ Пелнер, Дженни; Пелнер, Джеймс. "Minimal Intel Architecture Boot Loader" . Получено 14 октября 2017 г.
  9. ^ Домас, Кристофер (2015). "The Memory Sinkhole: An architecture privilege escalation failure" (PDF) . Battelle Memorial Institute. Архивировано (PDF) из оригинала 2017-01-05 . Получено 2017-01-04 . Процессор загружает архитектурно определенное состояние системы "Unreal" mode
  10. ^ "X86-64 Instruction Coding". Архивировано из оригинала 2017-01-03 . Получено 2015-02-18 .
  11. ^ "Flat Real Mode". 1998-03-16. Архивировано из оригинала 2015-08-18.
  12. ^ Браун, Ральф Д. "Список прерываний". INT 80 (AMI BIOS) . Получено 14 октября 2017 г.
  13. ^ ab Necasek, Michal (2018-06-15). "Краткая история Unreal Mode". Музей OS/2 .
  14. ^ Браун, Ральф Д. "Список прерываний". INT 78 (драйвер HugeRealMode) . Получено 14 октября 2017 г.
  15. ^ Грыстар, Томаш (2010-09-17). "unREAL Mode" . Получено 2017-10-14 .

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