Из Википедии, бесплатной энциклопедии
  (Перенаправлено из расширений виртуального режима )
Перейти к навигации Перейти к поиску

В микропроцессоре 80386 и более поздних версиях виртуальный режим 8086 (также называемый виртуальным реальным режимом , V86-режимом или VM86 ) позволяет выполнять приложения реального режима , которые не могут работать непосредственно в защищенном режиме, в то время как процессор работает под управлением операционной системы защищенного режима. Это метод аппаратной виртуализации , который позволил чипу 386 эмулировать несколько процессоров 8086; он возник в результате болезненного опыта работы с защищенным режимом 80286 , который сам по себе не подходил для эффективного выполнения параллельных приложений реального режима. [1]

В режиме 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 [2], но с очень ограниченным прямым доступом к оборудованию. Некоторые загрузчики (например, GRUB ) используют защищенный режим и выполняют вызовы прерывания BIOS в режиме Virtual 8086. [3] [4]

Адресация памяти и прерывания [ править ]

Самая распространенная проблема при запуске кода 8086 из защищенного режима - это адресация памяти, которая полностью различается между защищенным и реальным режимами . Как уже упоминалось, при работе в режиме VM86 механизм сегментации переконфигурируется для работы так же, как в реальном режиме, но механизм подкачки по-прежнему активен и прозрачен для кода реального режима; таким образом, защита памяти по-прежнему применима, как и изоляция адресного пространства.

Когда возникают прерывания (аппаратные, программные и инструкции int), процессор выключает режим VM86 и возвращается к работе в полностью защищенном режиме для обработки прерывания. Кроме того, перед обслуживанием прерывания регистры DS, ES, FS и GS помещаются в новый стек и обнуляются.

Расширения режима Virtual-8086 (VME) [ править ]

Архитектура Pentium добавила ряд улучшений в виртуальный режим 8086. Однако они были задокументированы Intel только начиная с последующего P6 (микроархитектура) ; [5] их более позднее формальное название - Virtual-8086 Mode Extensions, сокращенно VME [6] (более старая документация может использовать «Расширения режима Virtual 8086» в качестве расширения аббревиатуры VME). [5] Некоторые более поздние чипы Intel 486 также поддерживают его. [7] [8] Усовершенствования касаются в основном служебных данных виртуализации 8086, с особым вниманием к (виртуальным) прерываниям. [5] [9] До того, как расширения были публично задокументированы в документации P6, в официальной документации упоминался знаменитыйПриложение H , которое было исключено из общедоступной документации и предоставлено только избранным партнерам в рамках NDA .

Активация VME выполняется установкой бита номер 0 (значение 0x1) CR4 . Поскольку улучшения ускорения прерывания VME оказались полезными для задач, не защищенных VM86, их также можно включить отдельно, установив только бит номер 1 (значение 0x2), который называется PVI (виртуальные прерывания в защищенном режиме). [5] [8] Определение того, поддерживает ли процессор VME (включая PVI), выполняется с помощью инструкции CPUID с начальным значением EAX 0x1 путем проверки значения второго бита (номер бита 1, значение 0x2) в регистре EDX. , который устанавливается, если процессор поддерживает VME. [10] [5] В Linux, этот последний бит сообщается как VME флаг в / Proc / CPUInfo файл в разделе "флаги".

В виртуальном режиме 8086 основная идея заключается в том, что когда IOPL меньше 3, инструкции PUSHF / POPF / STI / CLI / INT / IRET будут обрабатывать значение VIF в реальном 32-битном регистре EFLAGS как значение IF в смоделированный 16-битный регистр FLAGS (32-битный PUSHFD / POPFD продолжает сбой GP). VIP вызовет ошибку GP при настройке смоделированного IF, заставляя ОС обрабатывать любые ожидающие прерывания. PVI - та же идея, но влияет только на инструкции CLI / STI.

Было обнаружено, что процессоры AMD Ryzen первого поколения имеют неработающую реализацию VME. [11] Во втором поколении Ryzen (серия 2000 г.) эта проблема устранена. [12]

64-разрядная версия и поддержка VMX [ править ]

Виртуальный режим 8086 недоступен в длинном режиме x86-64 , хотя он все еще присутствует на процессорах с поддержкой x86-64, работающих в устаревшем режиме .

Добавление VT-x вернуло возможность запускать виртуальный режим 8086 из длинного режима x86-64, но это должно быть сделано путем перевода (физического) процессора в корневой режим VMX и запуска самого логического (виртуального) процессора. в виртуальном режиме 8086. [13]

Процессоры Westmere и более поздние Intel обычно [14] могут запускать виртуальный процессор непосредственно в реальном режиме, используя функцию «неограниченного гостя» (которая сама требует расширенных таблиц страниц ); этот метод устраняет необходимость прибегать к вложенному виртуальному режиму 8086 просто для запуска устаревшего BIOS для загрузки. [15] [16]

См. Также [ править ]

  • IA-32
  • язык ассемблера x86

Заметки [ править ]

  1. ^ Например, если одна программа записывает на дисплей, затем другая программа получает управление и записывает на тот же дисплей, а затем первая программа получает управление обратно, она будет пытаться использовать дисплей, как если бы вторая программа не изменила его. Монитор V86 может перехватывать записи на дисплее, отслеживать состояние отображения для каждой программы и переключать реальный дисплей между ними в соответствии с тем, какую программу пользователь выбрал для взаимодействия в настоящее время. Монитор V86 эмулирует независимые дисплеи для каждой программы, используя только один реальный дисплей.
  2. ^ DOS упоминается, потому что это была особенно обширная библиотека существующих программ DOS, которую Intel имела в виду, когда разрабатывала режим V86.

Ссылки [ править ]

  1. ^ Ягер, Том (5 ноября 2004). «Отправка программного обеспечения для работы с оборудованием» . InfoWorld . Проверено 27 января 2014 года .
  2. ^ "Архитектура рабочей станции Windows NT 4.0" .
  3. ^ Майк Ван. «Процесс загрузки Grub2» . Цитировать журнал требует |journal=( помощь )
  4. ^ "Виртуальный режим 8086 - OSDev Wiki" . wiki.osdev.org . Проверено 10 декабря 2020 .
  5. ^ а б в г д Т. Шенли (1998). Системная архитектура Pentium Pro и Pentium II . Эддисон-Уэсли. С. 427, 465–480. ISBN 978-0-201-30973-7.
  6. ^ Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 3 (3A, 3B, 3C и 3D): Руководство по системному программированию . Intel . Май 2020. с. 2-17.
  7. ^ "Архив списков рассылки: Re: 2.6.14: CR4 больше не нужно проверять на 486?" . Gossamer-threads.com . Проверено 20 февраля 2014 .
  8. ^ a b «Виртуальные прерывания защищенного режима Pentium (PVI)» . Rcollins.org . Проверено 20 февраля 2014 .
  9. ^ «Расширения виртуального режима на процессоре Pentium» . Rcollins.org . Проверено 20 февраля 2014 .
  10. ^ Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 2 (2A, 2B, 2C и 2D): Справочник по набору инструкций, AZ . Intel . Май 2020. С. 3–199, 3–221, 3–222.
  11. ^ Михал Necasek (12 мая 2017). «VME сломана на AMD Ryzen» . OS / 2 Музей .
  12. ^ "Руководство по редактированию процессоров AMD 17h моделей 00h-0Fh" (PDF) . AMD . Июнь 2018 г.
  13. ^ Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 3B: Руководство по системному программированию, часть 2 (PDF) . Intel . Сентябрь 2009 г. с. 29-1. Заархивировано из оригинала (PDF) 5 января 2010 г. Запись в виртуальную машину разрешена только гостям с включенным разбиением по страницам, которые находятся в защищенном режиме или в режиме виртуального 8086. Гостевое выполнение в других режимах работы процессора должно обрабатываться VMM особым образом. ; см. также CS 686: Специальная тема: Intel EM64T и VT Extensions (Spring 2007) , урок 24, как это сделать в Linux (не то чтобы код сильно устарел, поэтому может не работать как есть с текущими ядрами) -код даты можно найти здесь . Также имейте в виду, что этот пример кода сложнее, чем загрузка логического процессора в виртуальном режиме 8086; его конечная цель - сделать несколько вызовов BIOS в реальном режиме.
  14. ^ «Список технологий виртуализации Intel» . Ark.intel.com . Проверено 20 февраля 2014 . Список процессоров Intel, поддерживающих VT-x, но не EPT
  15. ^ "Intel добавила неограниченный гостевой режим в микроархитектуре Westmere и более поздних процессорах Intel, он использует EPT для преобразования доступа к физическому адресу гостя в физический адрес хоста. В этом режиме разрешен VMEnter без включения разбиения по страницам."
  16. ^ "Если" неограниченное гостевое "управление выполнением ВМ равно 1, то" разрешить EPT "управление исполнением ВМ также должно быть 1"