Введение
Особенность конкретного микропроцессора
В микропроцессоре 80386 и более поздних версиях виртуальный режим 8086 (также называемый виртуальным реальным режимом, режимом V86 или VM86) позволяет выполнять приложения, разработанные для реального режима, которые не могут работать напрямую в защищенном режиме, при том что процессор работает под управлением операционной системы в защищенном режиме. Это аппаратная технология виртуализации, которая позволила чипу 386 эмулировать работу нескольких процессоров 8086. Она появилась в результате неудачного опыта работы с защищенным режимом 80286, который сам по себе не обеспечивал эффективного одновременного запуска приложений реального режима. Джон Кроуфорд разработал бит виртуального режима в наборе регистров, что позволило создать эту среду. Режим VM86 использует схему сегментации, идентичную схеме реального режима (для обеспечения совместимости), которая формирует 20-битные линейные адреса аналогично тому, как 20-битные физические адреса формируются в реальном режиме, но при этом эти адреса подвергаются механизму страничной организации памяти защищенного режима.
Обзор
Виртуальный режим 8086 — это режим для задачи защищенного режима. Следовательно, процессор может переключаться между задачами VM86 и не-VM86, обеспечивая многозадачность устаревших приложений (DOS). Для использования виртуального режима 8086 операционная система настраивает виртуальный монитор режима 8086, который представляет собой программу, управляющую программой реального режима и эмулирующую или фильтрующую доступ к системным аппаратным и программным ресурсам. Монитор должен работать на уровне привилегий 0 и в защищенном режиме. Только программа 8086 выполняется в режиме VM86 и на уровне привилегий 3. Когда программа в реальном режиме пытается выполнить такие действия, как доступ к определенным портам ввода-вывода для использования аппаратных устройств или доступ к определенным областям в своем адресном пространстве, процессор перехватывает эти события и вызывает монитор V86, который анализирует, что пытается сделать программа реального режима, и либо выступает в качестве посредника для взаимодействия с аппаратным обеспечением, эмулирует предполагаемую функцию, к которой программа реального режима пыталась получить доступ, либо завершает программу реального режима, если она пытается выполнить что-то, что не может быть разрешено или адекватно поддержано (например, перезагрузить систему, установить видеорежим, который не поддерживается аппаратным обеспечением и не эмулируется, или перезаписать код операционной системы). Монитор V86 также может мягко отказывать в разрешении, имитируя отказ запрошенной операции — например, он может заставить дисковый накопитель всегда казаться недоступным, даже не проверяя его, а просто запрещая программе реального режима доступ к нему. Кроме того, монитор V86 может выполнять такие действия, как сопоставление страниц памяти, перехват вызовов и прерываний, и прерывать программу реального режима, позволяя программам реального режима выполняться в многозадачном режиме, как и программы защищенного режима. Перехватывая аппаратные и программные операции ввода-вывода программы реального режима и отслеживая состояние, которое ожидает программа V86, он может позволить нескольким программам совместно использовать одно и то же оборудование, не мешая друг другу. Таким образом, режим V86 предоставляет возможность для программ реального режима, предназначенных для однозадачной среды (например, DOS), выполняться одновременно в многозадачной среде.
Адресация памяти и прерывания
Наиболее распространенная проблема при запуске кода 8086 из защищенного режима — это адресация памяти, которая существенно отличается в защищенном и реальном режимах. Как уже упоминалось, при работе в режиме VM86 механизм сегментации перенастраивается для работы аналогично реальному режиму, однако механизм страничной организации памяти остается активным и не виден коду реального режима; таким образом, защита памяти и изоляция адресного пространства сохраняются. При возникновении прерываний (аппаратных, программных и вызванных инструкцией int) процессор отключает режим VM86 и возвращается к работе в полноценном защищенном режиме для обработки прерывания. Кроме того, перед обработкой прерывания регистры DS, ES, FS и GS сохраняются в новом стеке и обнуляются.
Расширения режима Virtual-8086 (VME)
Архитектура Pentium добавила ряд улучшений в виртуальный режим 8086. Однако Intel документировал их только начиная с последующей микроархитектуры P6; их более позднее официальное название – Virtual 8086 Mode Extensions, сокращенно VME (в более старой документации может использоваться "улучшения виртуального режима 8086" как расшифровка акронима VME). Эти улучшения в основном направлены на снижение накладных расходов виртуализации 8086, с особым упором на (виртуальные) прерывания. До публичной документации расширений в документации P6, официальная документация ссылалась на знаменитое Приложение H, которое было исключено из публичного доступа и предоставлялось только избранным партнерам под NDA. Активация VME выполняется установкой бита номер 0 (со значением 0x1) регистра CR4. Поскольку улучшения скорости обработки прерываний VME оказались полезными и для защищенных задач, не использующих VM86, их также можно включить отдельно, установив только бит номер 1 (со значением 0x2), что называется PVI (Protected Mode Virtual Interrupts). Процессоры второго поколения Ryzen (серия 2000) устранили эту проблему.
Поддержка 64-битных и VMX
Режим виртуального 8086 недоступен в 64-битном режиме x86 64, хотя он по-прежнему присутствует на процессорах, поддерживающих x86 64, работающих в устаревшем режиме. Intel VT-x возвращает возможность запуска режима виртуального 8086 из 64-битного режима x86 64, но для этого необходимо перевести (физический) процессор в корневой режим VMX и запустить логический (виртуальный) процессор, работающий в режиме виртуального 8086. Процессоры Westmere и более поздние процессоры Intel обычно могут запускать виртуальный процессор непосредственно в реальном режиме, используя функцию "неограниченный гость" (которая сама по себе требует расширенные таблицы страниц); этот метод избавляет от необходимости использовать вложенный режим виртуального 8086 просто для запуска устаревшей BIOS при загрузке. AMD-V также поддерживает режим виртуального 8086 в гостевых системах, но может просто запустить гостя в "страничном реальном режиме", выполнив следующие шаги: создайте гостя в режиме SVM (Secure Virtual Machine) с CR0.PE=0, но CR0.PG=1 (то есть с отключенным защищенным режимом, но включенной страничной организацией памяти), что обычно невозможно, но разрешено для гостевых систем SVM, если хост перехватывает ошибки страниц.