Режим виртуального 8086
(V86, VM86, иногда просто
виртуальный режим
) — режим адресации процессоров семейства
x86
совместимый с прародителем семейства — процессором Intel
8086
. Является подрежимом
защищенного
. Впервые появился в процессоре 80386 и предназначался главным образом для создания т. н. «виртуальных
DOS
-машин»,
виртуальных сред
для исполнения приложений господствовавшей в то время в мире персональных ЭВМ операционной системы MS-DOS. Является первой попыткой корпорации
Intel
внедрить в свои процессоры технологии
аппаратной виртуализации
.
Содержание
Особенности
Задача виртуального 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), а для перехвата ввода-вывода требуется использование битовой карты разрешения портов в сегменте состояния задачи;
Расширения
Начиная с процессора Pentium в режим V86 были введены опциональные функции: таблица перенаправления прерываний и виртуализация флажка прерываний. Теперь процессор, без вмешательства ОС мог непосредственно использовать таблицу векторов прерываний по адресу 0, причем не для всех прерываний, а только для тех, что разрешила операционная система с помощью специальной битовой карты (аналогичной карте ввода-вывода) в сегменте состояния задачи. Виртуализация флага прерываний также уменьшает число исключительных ситуаций, требующих программной обработки операционной системой, что, в свою очередь, сказывается на общей производительности.
V86 и x86-64
Процессоры с архитектурой
x86-64
поддерживают V86 только в наследственном, но не в длинном режиме. В длинном режиме флажок EFLAGS.VM попросту игнорируется. Поэтому, для поддержки виртуальных DOS-задач требуется переключение в наследственный режим, сопряженное с двойным сбросом
MMU
. А поскольку
роль DOS и её приложений в наши дни практически сошла на нет, операционные системы x86-64 не включают такого рода поддержку V86. Тем не менее, некоторые современные средства аппаратной виртуализации позволяют виртуализовать как реальный режим, так и V86, получая в результате двойную виртуализацию.
Поддержка операционными системами
MS-DOS
— В DOS режим V86 использовался для эмуляции
расширенной памяти
по стандарту LIM/EMS при помощи специального драйвера
. Поскольку в этом режиме, в отличие от реального, возможна трансляция страниц, расширенная память эмулировалась с помощью отображения
дополнительной
в окно адресов UMB/EMS. Также драйвер позволял в адресах UMB размещать данные и резидентные программы.
OS/2
— В составе OS/2 имелась штатная виртуальная DOS-машина.
Windows
— В составе Windows начиная с версии 3.0 появился 386 расширенный режим, который позволял создавать V86-задачи для программ DOS («DOS в окне»).
Linux
— ОС Linux/x86 поддерживается системный вызов vm86() которым активно пользуется программа
DOSEMU
— свободная реализация виртуальной DOS-машины (в последнее время вытесненяемая
эмулятором
DOSBox
, поскольку эмуляция, несмотря на большие ресурсозатраты более точно имитирует работу компьютера, что было важно для программ того времени, довольно часто обращающихся к аппаратным средствам непосредственно).
FreeBSD
— В ОС FreeBSD/i386 имеется поддержка V86 и встренная программа doscmd, обладающая гораздо меньшими возможностями, чем DOSEMU, поэтому практически не используемая.