stringtranslate.com

Виртуальный режим 8086

В микропроцессоре 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 помещаются в новый стек и обнуляются.

Расширения режима Virtual-8086 (VME)

Архитектура 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]

Поддержка 64-битной версии и VMX

Виртуальный режим 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]

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

Примечания

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

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

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