VM86 (Virtual 8086 mode)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:54, 6 марта 2019.
Принцип взаимодействий систем.

Виртуальный режим 8086 (англ. virtual mode 8086, «виртуальный режим 86») — режим виртуального процессора 8086 , для краткости обычно именуемый режимом V86, является подрежимом защищённого режима (protected mode). Впервые он появился в микропроцессоре 80386. Главное его назначение — обеспечить базу для выполнения написанных для реального режима программ в операционных системах, функционирующих в защищённом режиме [Источник 1]

Программный переход в режим V86 может быть осуществлён только из защищённого режима. Из режима V86 возможен выход в защищённый режим. Кроме того, возможен аппаратный переход из режима V86 в режим управления системой (это происходит при поступлении сигнала SMI), а также программный возврат в режим V86 из режима управления системой.

Историческая актуальность

Virtual 8086 — режим, который был должен помочь перевести пользователей приложений MS-DOS на новые, современные многозадачные ОС и на новые процессоры, их поддерживающие. На этот раз реальная железка, которую виртуализовывали, существовала — это был Intel 8086. Защищённый режим, введённый в 80286 процессоре, оказался непохожим и потому крайне неудобным для запуска приложений, ожидавших честный 8086. Новых приложений для защищённого режима ещё не написали, а от старых DOS-программ никто отказываться не хотел.

В следующем продукте Intel 80386 — появился особый тип аппаратной задачи, более точно создающий привычную для них среду, с 20-битными адресами и сегментами, возможностью прямой записи в устройства и т.п. И снова специальный программный монитор следит за всеми исполняющимися в VM86-режиме приложениями, прозрачно для них подкладывая страницы памяти, эмулируя устройства, а иногда и просто не разрешая выполнять операции: если одна DOS-программа решила перезагрузить компьютер, то лучше не давать ей это сделать.

Необходимость добавления VM86-режима была обусловлена экономическими причинами: невозможно было сразу переписать (и даже просто убедить всех в необходимости) все DOS-приложения так, чтобы они использовали возможности защищённого режима. Сейчас, когда прикладное ПО сразу пишется для него, необходимость в VM86 понизилась. Однако все современные процессоры всё равно поддерживают режим Virtual 8086: некоторый код, такой как Option ROMs периферийных устройств, вполне может ожидать наличие старого доброго 8086.

i386

VM-86 - это режим виртуальной адресации i86. Режим устанавливает исполнительную среду i8086 внутри многозадачной среды PM CPU i386. При этом поддерживается выполнение всех программ для предыдущих поколений микропроцессоров ix86. Сначала, в рамках VM86, формируется 20-разрядный линейный адрес по системе RM, но включается механизм страничной адресации и система двухуровневой защиты памяти. Адрес, шириной в 1 Мбайт, может быть разбит на 256 страниц по 4 Кбайт каждая и размещен в физическом адресном пространстве до 4 Гбайт. В этом объеме адресов ОЗУ можно, в окнах (frame) по 1 Мбайт, расположить множество копий MS DOS, или других ОС и пользовательских программ, представляющих отдельные виртуальные машины, работающие в многозадачном режиме. Вход и выход в режим VM86 возможен следующими способами: - загрузкой регистра флагов EFLAGS [17];

  • переключением с задачи на задачу с использованием сегмента состояния задачи (TSS);
  • в процедуре прерывания (команда IRET);
  • ассемблерной командой POPF.[Источник 2]

Характеристика режима виртуальной адресации

Режим виртуальной адресации V86 - устанавливает исполнительную среду I86 внутри защищенной многозадачной среды PM CPU I386. При этом поддерживается исполнение всех программ, написанных для предыдущих поколений. Первоначально в рамках VM 86 оборудование формирует 20-разрядный линейный адрес по системе, аналогичной RM. Однако, благодаря включению механизма страничной адресации и системе двухуровневой защиты, линейный адрес шириной в 1 Мбайт может быть разбит на 256 страниц по 4 Кбайт каждая, и размещен в физическом адресном пространстве до 4 Гбайт. В этом объеме физической памяти можно в окнах по 1 Мбайт расположить множество копий MS DOS или других операционных систем и их программ, представляющих отдельные виртуальные машины, работающие в мультизадачном режиме. Вход и выход в режим VM86 возможен посредством перезагрузки регистра флагов (бит 17), либо при переключении с задачи на задачу с привлечением сегмента состояния задачи (TSS), либо в процедуре прерывания (команда IRET), либо при использовании команды POPF [Источник 3].

Особенности работы процессора при передаче управления обработчику прерываний в режиме V86

собенность режима V86 прежде всего состоит в том, что любая задача V86 обязательно имеет 32-битный сегмент состояния задачи (TSS). 16-битный сегмент состояния задачи (TSS), поддерживаемый всеми моделями процессоров, начиная с Intel286 (и более поздними – для совместимости), содержит только младшее слово регистра EFLAGS, не включающее бит VM. Для правильного обслуживания прерываний в 32-битной программной среде в таблице дескрипторов прерываний (IDT) должны использоваться только 32-битные шлюзы (гипотетически это не касается только случая использования шлюза задачи) – здесь не могут использоваться 16-битные шлюзы, так как они не обеспечивают сохранение всех 32-битных значений регистров, которые нужны для нормального возврата в режим V86 после обработки прерывания. Такой возврат обеспечивается только командой IRETD, выполняемой на нулевом уровне привилегий, которая загружает 32-битный образ из стека в регистр EFLAGS с установленным битом VM, либо, если вход в обработчик прерывания был произведен как во вложенную задачу через шлюз задачи – при возврате из него командами IRET/IRETD с одновременным переключением задач.

Когда расширение виртуального режима не инициализировано (CR4.VME = 0), при поступлении запроса на прерывание в режиме V86 процессор автоматически переключается в защищенный режим с уровнем привилегий CPL = 0 (в связи с этим происходит замена указателя стека SS:ESP на стек нулевого уровня привилегий из сегмента состояния задачи TSS) и обращается к соответствующему дескриптору прерывания в таблице IDT. Если в качестве такого дескриптора используется 32-битный шлюз ловушки или шлюз прерывания, то он должен указывать на несогласованный кодовый сегмент с нулевым уровнем привилегий (максимум привилегий), в противном случае генерируется ошибка общей защиты (#GP) с селектором этого сегмента в коде ошибки.

После переключения на нулевой уровень привилегий и загрузки новых значений указателя стека SS:ESP процессор сохраняет в стеке текущие значения сегментных регистров GS, FS, DS, ES, а затем очищает эти регистры, помещая в них нулевые селекторы. Далее действия процессора идентичны процедуре обработки прерываний защищенного режима: он сохраняет в стеке старые значения SS, ESP, EFLAGS, CS и EIP, сбрасывает флаги VM, NT, TF, RF и IF (последний сбрасывается, только если используется шлюз прерывания) регистра флагов EFLAGS и передает управление в обработчик прерывания. Если при вызове программных прерываний (за исключением команды INT 3) текущий уровень привилегий ввода/вывода EFLAGS.IOPL меньше текущего уровня привилегий задачи (то есть EFLAGS.IOPL < 3), то генерируется ошибка общей защиты (#GP) и управление передается в обработчик этой ошибки.

Обработчик прерывания может либо выполнить обработку прерывания самостоятельно, либо передать эту функцию монитору задач V86, либо возвратить управление прерванной задаче, эмулируя поступление прерывания по протоколу процессора 8086.

При возврате из прерывания по завершении работы программы обработчика защищенного режима процессор получает команду IRETD. Последовательно загружая сохраненные в стеке значения, он считывает и значение флага EFLAGS.VM. При обнаружении единицы в этом флаге производится обратное переключение в режим V86 и восстановление из стека сегментных регистров ES, DS, FS, GS, после чего управление передается в прерванную программу. Если команда IRETD будет получена на уровне привилегий, отличном от нуля, то процессор не сможет установить флаг EFLAGS.VM – и соответственно – не переключится в режим V86 — возврат будет произведен некорректно [Источник 4].

Особенности

Задача виртуального режима 8086 представляет собой обычную задачу защищенного режима со следующими особенностями:

  • Режим активируется установкой флажка EFLAGS.VM с помощью привилегированной инструкции (IRET, JMP <task>) (непривилегированная команда POPF, даже исполняясь на уровне привилегий 0, состояния этого флажка не изменяет).
  • Адрес, аналогично реальному режиму, является двухкомпонентным, состоящим из 16-битного номера 16-байтного параграфа, задающего базовый адрес сегмента и 16-битного смещения внутри сегмента;
  • Исходя из формата адреса, возможна адресация только нижнего мегабайта памяти (+65520 байт HMA); однако, благодаря страничному отображению, в эту область могут быть отображены произвольные страницы памяти, что позволяет организовать мультизадачность для задач DOS;
  • Задача исполняется с самыми низкими привилегиями в кольце 3.
  • Прерывания обрабатываются обычными обработчиками ОС защищенного режима. Таблица векторов прерываний по адресу 0 не используется (если не активно расширение VME). Модуль операционной системы, часто называемый V86-монитором, может эмулировать прерывание реального режима, программно обращаясь к этой таблице;
  • Меняется значение поля EFLAGS.IOPL. В режиме V86 оно используется для перехвата некоторых инструкций (CLI, STI, PUSHF, POPF, INT, IRET), а для перехвата ввода-вывода требуется использование битовой карты разрешения портов в сегменте состояния задачи;

vm86(2)

Системный вызов vm86 был введён в Linux 0.97p2. В Linux 2.1.15 и 2.0.28 он был переименован в vm86old, и был введён новый vm86 . Описание структуры `struct vm86_struct' было изменено в 1.1.8 и 1.1.9.

Данные вызовы заставляют вызывающий процесс войти в режим VM86 (виртуальный режим 8086 в литературе по Intel) и используются dosemu.

Режим VM86 - это эмуляция реального режима внутри задачи, которая работает в защищённом режиме.

Возвращаемое значение

В случае успеха, возвращается ноль. При ошибке возвращается -1 и значение errno устанавливается соответствующим образом.

Ошибки

EPERM

Существует сохранённый стек ядра. (Это проверка ядра; сохранённый стек должен существовать только внутри самого режима vm86).

EFAULT

Возвращённое значение является специфичным для i386 и указывает на проблему получения данных в пространстве пользователя.

ENOSYS

Возвращённое значение указывает на вызов, который не реализован на данной архитектуре.

Соответствие стандартам

Данный вызов является специфичным для Linux на процессорах Intel и не должен использоваться в программах, которые задумываются как переносимые на другие платформы.[Источник 5]

Поддержка операционными системами

VM 86 поддерживает такие операционные системы как:

Во всех этих ОС виртуальный режим нужен для использования DOS-машины.

Virtual mode 8086 в наши дни

На сегодняшний день VM 86 редко используется, если не требуется обеспечить двойную виртуализацию. Так же на современных ОС могут возникнуть проблемы с запуском VM86, так как сейчас архитектура процессора использует длинный режим в котором игнорируется флажок DOS-машины. Для запуска этого режима требуется переключение в наследственный режим [Источник 6].

Источники

  1. Режим виртуального 8086 // Википедия. Дата обновления: 04.03.2017. URL: https://ru.wikipedia.org/w/index.php?title=Режим_виртуального_8086&vesection=0 (дата обращения: 20.05.2017).
  2. Архитектура IBM-совместимых ПК // bourabai [2019]. Дата изменения: 01.01.2019. URL: https://bourabai.ru/hardware/ibmpc11.htm (дата обращения: 10.01.2019).
  3. Характеристика режима виртуальной адресации (VM 86) // Викиверситет. URL: http://ru.wikiversity.wikia.com/wiki/Характеристика_режима_виртуальной_адресации_(VM_86) (дата обращения: 20.05.2017).
  4. Protected Mode // Serg Iakovlev. URL: http://iakovlev.org/index.html?p=8805#V86%20Mode (дата обращения: 20.05.2017).
  5. vm86 (2) // OpenNET [1996–2019]. Дата изменения: 01.01.2004. URL: https://www.opennet.ru/man.shtml?topic=vm86&category=2&russian=0 (дата обращения: 10.01.2019).
  6. Virtual 8086 mode // Revolvy. Дата обновления: 20.03.2017. URL: https://www.revolvy.com/main/index.php?s=Virtual%208086%20mode&item_type=topic (дата обращения: 20.05.2017).