В микропроцессоре 80386 и более поздних версиях виртуальный режим 8086 (также называемый виртуальным реальным режимом , режимом V86 или VM86 ) позволяет выполнять приложения реального режима , которые не могут работать непосредственно в защищенном режиме , когда процессор работает под управлением операционной системы защищенного режима. . Это метод аппаратной виртуализации , который позволяет эмулировать несколько процессоров 8086 с помощью чипа 386. Оно возникло в результате болезненного опыта с защищенным режимом 80286 , который сам по себе не подходил для одновременного запуска приложений реального режима. [1] Джон Кроуфорд разработал бит виртуального режима в наборе регистров, проложив путь к этой среде. [2]
В режиме VM86 используется схема сегментации , идентичная схеме сегментации в реальном режиме (по соображениям совместимости), которая создает 20-битные линейные адреса таким же образом, как 20-битные физические адреса создаются в реальном режиме, но на них распространяется механизм подкачки памяти защищенного режима. .
Виртуальный режим 8086 — это режим для задачи защищенного режима . Следовательно, процессор может переключаться между задачами VM86 и задачами, отличными от VM86, позволяя использовать многозадачные устаревшие ( DOS ) приложения.
Чтобы использовать виртуальный режим 8086, операционная система настраивает монитор виртуального режима 8086, который представляет собой программу, которая управляет программой реального режима и эмулирует или фильтрует доступ к аппаратным и программным ресурсам системы. Монитор должен работать с уровнем привилегий 0 и в защищенном режиме. Только программа 8086 работает в режиме VM86 и с уровнем привилегий 3. Когда программа реального режима пытается выполнить такие действия, как доступ к определенным портам ввода-вывода для использования аппаратных устройств или доступ к определенным областям в своем пространстве памяти, ЦП перехватывает эти события и вызывает монитор V86, который проверяет, что пытается сделать программа реального режима, и либо действует как прокси для взаимодействия с оборудованием, эмулирует намеченную функцию, к которой пыталась получить доступ программа реального режима, либо завершает программу реального режима, если он пытается сделать что-то, что не может быть разрешено или адекватно поддержано (например, перезагрузить компьютер, установить видеодисплей в режим, который не поддерживается аппаратным обеспечением и не эмулируется, или перезаписать код операционной системы).
Монитор V86 также может мягко отказывать в разрешении, имитируя сбой запрошенной операции — например, он может всегда показывать дисковод неготовым, хотя на самом деле он даже не проверил диск, но просто не разрешает работу программы в реальном режиме. чтобы получить к нему доступ. Кроме того, монитор V86 может выполнять такие действия, как отображение страниц памяти, перехват вызовов и прерываний, а также вытеснение программы реального режима, позволяя программам реального режима выполнять несколько задач, как программы защищенного режима. Перехватывая аппаратный и программный ввод-вывод программы реального режима и отслеживая состояние, которое ожидает программа V86, он может позволить нескольким программам использовать одно и то же оборудование, не мешая друг другу. [a] Таким образом, режим V86 предоставляет возможность программам реального режима, разработанным для однозадачной среды (например, DOS [b] ), работать одновременно в многозадачной среде.
Он используется для выполнения определенных программ DOS в FlexOS 386 (с 1987 г.), Concurrent DOS 386 (с 1987 г.), Windows/386 2.10 (с 1987 г.), DESQview 386 (с 1988 г.), Windows 3.x (с 1990 г.), многопользовательском режиме . DOS (с 1991 г.), Windows for Workgroups 3.1x (с 1992 г.), OS/2 2.x (с 1992 г.), 4690 OS (с 1993 г.), REAL/32 (с 1995 г.), работающие в расширенном режиме 386, а также в Windows 95 , 98 , 98 SE и ME через виртуальные машины DOS , в SCO UNIX через Merge и в Linux через DOSEMU . (Другие программы DOS , использующие защищенный режим, выполняются в пользовательском режиме эмулятора.) NTVDM в операционных системах x86 на базе Windows NT также использует режим VM86 [3] , но с очень ограниченным прямым доступом к оборудованию. Некоторые загрузчики (например, GRUB ) используют защищенный режим и выполняют вызовы прерываний BIOS в режиме Virtual 8086. [4] [5]
Самая распространенная проблема при запуске кода 8086 в защищенном режиме — это адресация памяти , которая совершенно различна в защищенном и реальном режимах . Как уже упоминалось, при работе в режиме VM86 механизм сегментации перенастраивается для работы так же, как и в реальном режиме, но механизм подкачки по-прежнему активен и прозрачен для кода реального режима; таким образом, защита памяти по-прежнему применима, как и изоляция адресного пространства.
При возникновении прерываний (аппаратных, программных и инструкций int) процессор выключает режим VM86 и возвращается к работе в полностью защищенном режиме для обработки прерывания. Кроме того, перед обслуживанием прерывания регистры DS, ES, FS и GS помещаются в новый стек и обнуляются.
Архитектура Pentium добавила ряд улучшений в виртуальный режим 8086. Однако они были задокументированы Intel только начиная с последующего P6 (микроархитектура) ; [6] их более позднее официальное название — Virtual-8086 Mode Extensions, сокращенно VME [7] (в более старой документации могут использоваться «Улучшения режима Virtual 8086» в качестве расширения аббревиатуры VME). [6] Некоторые более поздние чипы Intel 486 также поддерживают эту технологию. [8] [9] Усовершенствования касаются в основном накладных расходов виртуализации 8086, уделяя особое внимание (виртуальным) прерываниям. [6] [10] До того, как расширения были публично задокументированы в документации P6, официальная документация ссылалась на знаменитое Приложение H , которое было исключено из общедоступной документации и предоставлялось только избранным партнерам в рамках NDA .
Активация VME осуществляется установкой бита номер 0 (значение 0x1) в CR4 . Поскольку улучшения ускорения прерываний VME оказались полезными для задач, не защищенных VM86, их также можно включить отдельно, установив только бит номер 1 (значение 0x2), который называется PVI (виртуальные прерывания в защищенном режиме). [6] [9] Определение того, поддерживает ли процессор VME (включая PVI), осуществляется с помощью инструкции CPUID с начальным значением EAX, равным 0x1, путем проверки значения второго бита (номер бита 1, значение 0x2) в регистре EDX. , который устанавливается, если процессор поддерживает VME. [11] [6] В Linux этот последний бит указывается как флаг vme в файле /proc/ cpuinfo в разделе «флаги».
В виртуальном режиме 8086 основная идея заключается в том, что когда IOPL меньше 3, инструкции PUSHF/POPF/STI/CLI/INT/IRET будут обрабатывать значение VIF в реальном 32-битном регистре EFLAGS как значение IF в виртуальном режиме 8086. смоделированный 16-битный регистр FLAGS (32-битный PUSHFD/POPFD продолжает работать при ошибке GP). VIP вызовет ошибку GP при настройке моделируемого IF, предписывая ОС обрабатывать любые ожидающие прерывания. PVI — та же идея, но влияет только на инструкции CLI/STI.
Было обнаружено, что процессоры AMD Ryzen первого поколения имеют сломанную реализацию VME. [12] Во втором поколении Ryzen (серия 2000 г.) эта проблема устранена. [13]
Виртуальный режим 8086 недоступен в длинном режиме x86-64 , хотя он все еще присутствует на процессорах с поддержкой x86-64, работающих в устаревшем режиме .
Intel VT-x возвращает возможность запуска виртуального режима 8086 из длинного режима x86-64, но это необходимо сделать путем перевода (физического) процессора в корневой режим VMX и запуска самого логического (виртуального) процессора, работающего в виртуальном 8086. режим. [14]
Процессоры Intel Westmere и более поздних версий обычно [15] могут запускать виртуальный процессор непосредственно в реальном режиме, используя функцию «неограниченного гостя» (которая сама по себе требует расширенных таблиц страниц ); этот метод устраняет необходимость прибегать к вложенному виртуальному режиму 8086 просто для запуска устаревшего BIOS для загрузки. [16] [17]
AMD-V также может использовать виртуальный режим 8086 в гостях, но он также может просто запустить гостя в «реальном подкачиваемом режиме», выполнив следующие шаги: вы создаете гостя в режиме SVM (безопасная виртуальная машина) с CR0.PE=0, но CR0.PG=1 (то есть с отключенным защищенным режимом, но включенным подкачкой), что обычно невозможно, но разрешено для гостей SVM, если хост перехватывает ошибки страницы. [18]
{{cite journal}}
: Требуется цитировать журнал |journal=
( помощь )Вход в виртуальную машину разрешен только гостям с включенным пейджингом, которые находятся в защищенном режиме или в режиме виртуального-8086.
Гостевое выполнение в других режимах работы процессора должно быть специально обработано VMM.; см. также CS 686: Специальная тема: Intel EM64T и расширения VT (весна 2007 г.), урок 24, как это сделать в Linux (не то чтобы код сильно устарел, поэтому может не работать с текущими ядрами как есть). -код даты можно найти здесь. Также имейте в виду, что этот пример кода более сложен, чем строгая загрузка логического процессора в виртуальном режиме 8086; его конечная цель — выполнить несколько вызовов BIOS в реальном режиме.
Список процессоров Intel, поддерживающих VT-x, но не EPT
Чтобы облегчить виртуализацию реального режима, инструкция VMRUN может легально загрузить значение гостевого CR0 с PE = 0, но PG = 1. Аналогичным образом, команде RSM разрешено вернуться в страничный реальный режим.
Этот режим процессора во всех отношениях аналогичен реальному режиму, за исключением применения подкачки.
Цель состоит в том, чтобы VMM запускал гостя в страничном режиме на уровне CPL0 и перехватывал ошибки страниц.
VMM отвечает за настройку таблицы теневых страниц, которая сопоставляет гостевую физическую память с соответствующими физическими адресами системы.
Поведение при запуске гостя в страничном реальном режиме без перехвата ошибок страниц в VMM не определено.