Виртуальная машина DOS

Виртуальная машина DOS (англ. Virtual DOS machine, VDM) — технология, позволяющая запускать 16-разрядные и 32-разрядные программы для DOS и 16-разрядного Windows при одновременной работе другой операционной системы, управляющей аппаратным обеспечением.

Обзор

Виртуальные машины DOS (VDM) могут функционировать как исключительно посредством стандартной программной эмуляции, так и за счёт использования виртуальный 8086-режима процессора Intel 80386, позволяющего выполнять 8086-программы в реальном режиме в управляемой среде, перехватывая обращения к защищённому оборудованию и передавая их основной операционной системе (как исключения). Операционная система затем может эмулировать требуемые операции и возобновлять выполнение DOS-программы.

Обычно VDM реализуют поддержку исполнения 16-разрядного и 32-разрядного защищённого ПО с помощью DOS-расширителей, соответствующих спецификации Интерфейс DOS Protected Mode (DPMI).

Когда DOS-программа внутри VDM обращается к периферии, Windows, как правило, предоставляет либо прямой доступ, либо виртуальный драйвер устройства (VDD), эмулирующий аппаратную работу средствами ОС. VDM систематически реализует эмуляцию контроллеров прерываний Intel 8259A, таймеров 8254, контроллеров DMA 8237 и других.

Режим эмуляции 8086 в Concurrent DOS

В январе 1985 года компания Digital Research совместно с Intel продемонстрировала Concurrent DOS 286 1.0, версию Concurrent DOS, способную запускать программы для DOS в режиме защищённой памяти процессоров 80286. Однако реализованный метод, использовавшийся на процессорах ревизии B-1, уже в мае 1985 года перестал работать на чипах C-1 и последующих ревизиях перед выходом готового продукта. В августе 1985 года с ревизией E-1 Intel начала устранять эти проблемы, что позволило эмуляции 8086 снова работать посредством неофициальной инструкции LOADALL, однако скорость этой реализации была непрактичной. Изменения микрокода в версии E-2 вновь повысили её производительность. Эта ранняя реализация считается предшественником современных виртуальных машин DOS.

Впоследствии Concurrent DOS 286 была переделана из настольной ОС в FlexOS 286 для промышленного применения. IBM лицензировала её для своей 4680 OS в том же году.

С появлением процессора 80386 и его виртуального 8086-режима, Digital Research стала использовать этот режим для запуска DOS-программ в VDM под управлением Concurrent DOS 386 1.0 и FlexOS 386 1.0. Однако архитектура этих многопользовательских многозадачных защищённых ОС не основывалась непосредственно на DOS.

Concurrent DOS 386 эволюционировала в Multiuser DOS, затем в REAL/32. FlexOS 386 позднее стал 4690 OS.

VDM, основанные на DOS

В отличие от этих защищённых ОС, DOS по умолчанию является системой в реальном режиме, переходящей в защищённый режим и режим виртуального 86 только для менеджеров памяти и DOS-расширителей, чтобы предоставить доступ к расширенной памяти или отобразить память в первый мегабайт — область, доступную для обычных программ DOS.

VDM, работающие поверх DOS, появились с выходом Windows/386 2.01 от Microsoft. Такие VDM также были реализованы в Windows 3.0, 3.1x, Windows for Workgroups 3.1x (режим 386 Enhanced), Windows 95, 98, 98 SE и ME. Характерная черта этих решений — использование виртуальных экземпляров DOS и его драйверов, загружаемых до старта многозадачности; запросы, не исполнимые в защищённом режиме, передаются основной системе DOS для выполнения.

По архитектуре, схожей с 386 Enhanced в Windows 3.x, EMM386 3.xx в Novell DOS 7, Caldera OpenDOS 7.01, DR-DOS 7.02 использует VDM для поддержки вытесняющей многозадачности DOS-приложений с параметром EMM386 /MULTI. Разработка этой компоненты велась Digital Research / Novell с 1991 года под кодовым именем Vladivar. Основной выпуск — Novell DOS 7, применялась также в не вышедших DR DOS "Panther" и Star Trek.

Множественные виртуальные машины DOS (MVDM) в OS/2

Множественные виртуальные машины DOS (MVDM) используются в OS/2 2.0 и новее с 1992 года. MVDM ОС/2 значительно превосходят по функциональности NTVDM. Например, поддерживаются блочные устройства, возможно использование разных версий DOS в рамках одной MVDM. Если в OS/2 1.x базовая «DOS box» эмулировала DOS 3.0, то MVDM в OS/2 2.x эмулируют DOS 5.0.

Шовная интеграция приложений Windows 3.1 и Win32s в OS/2 внешне напоминает схожую интеграцию приложений в XP Mode на базе Windows Virtual PC в Windows 7. Редиректор в гостевой VDM или NTVDM позволяет обращаться к дискам основной (host) системы ОС/2 или NT. Приложения внутри гостя используют именованные каналы (named pipe) для взаимодействия с основной ОС.

Из-за технических ограничений программы для DOS и 16-разрядного Windows в OS/2 раньше не «видели» более 2 ГБ пространства на жёстком диске; это устранено начиная с ArcaOS 5.0.4.

NTVDM в Windows

NTVDM — системный компонент всех 32-разрядных версий семейства Windows NT начиная с Windows NT 3.1, обеспечивающий выполнение 16-разрядных приложений Windows и 16-/32-разрядных DOS-программ. В Windows NT основным пользователским процессом, реализующим отдельную среду DOS (или Windows 3.x), является файл ntvdm.exe.

Для запуска DOS-программы NTVDM загружает NTIO.SYS, далее — NTDOS.SYS, затем модифицированный COMMAND.COM, который выполняет целевое приложение, переданное NTVDM в командной строке. 16-разрядные системные файлы — упрощённые производные от файлов MS-DOS 5.0: IO.SYS, MSDOS.SYS, COMMAND.COM с устранением привязки к FAT и использованием специальной инструкции 0xC4 0xC4 для передачи управления в 32-разрядный уровень NTVDM. Изначально NTDOS сообщал приложениям версию DOS 30.00, но вскоре это изменили: функция INT 21h/AH=30h — 5.00, INT 21h/AX=3306h — 5.50, чтобы повысить совместимость. До сих пор многие дополнительные функции и команды, появившиеся в MS-DOS 6.x и Windows 9x, отсутствуют.

16-разрядные Windows-приложения по умолчанию работают каждое в своём потоке внутри одного процесса NTVDM. Хотя NTVDM — 32-разрядный вытесняемый процесс по отношению к системе, 16-разрядные приложения внутри него работают кооперативно относительно друг друга. При включении опции «Запускать в отдельной области памяти» в диалоговом окне «Выполнить» или в ярлыке каждое 16-разрядное приложение получает отдельный процесс NTVDM и потому становится вытесняемым. NTVDM эмулирует вызовы BIOS и таблицы, а также ядро Windows 3.1 и заглушки 16-разрядного API. 32-разрядный слой WoW преобразует 16-разрядные вызовы API.

Для интерфейса DOS Protected Mode реализована 32-разрядная эмуляция DOS, включая преобразование обращений к расширенной и расширяемой памяти в вызовы Windows NT. wowexec.exe — уровень эмуляции 16-разрядного Windows. В Windows XP появилась эмуляция Sound Blaster 2.0. Виртуальные 16-разрядные драйверы устройств и блочные драйверы DOS (RAM-диски и т. п.) не поддерживаются. Обмен с другими подсистемами возможен через OLE, DDE и именованные каналы.

На процессорах, не совместимых с x86, например, MIPS, DEC Alpha, PowerPC, где виртуальный 8086-режим недоступен, NTVDM реализуется как полноценная эмуляция на базе лицензированного кода SoftPC от Insignia. До Windows NT 3.51 поддерживалась только эмуляция 80286, начиная с Windows NT 4.0486.

NTVDM отсутствует в 64-разрядных версиях Windows и для архитектуры ARM32 (таких как Windows RT, Windows 10 IoT Core). Последней версией Windows с поддержкой NTVDM является Windows 10, так как в Windows 11 поддержка 32-разрядных процессоров исключена.

Поддерживаемые команды

Следующие 16-разрядные команды MS-DOS-подсистемы входят в состав Windows XP:

Проблемы с безопасностью

В январе 2010 года сотрудник компании Google, исследователь безопасности Тавис Орманди, обнаружил серьёзную уязвимость в реализации VDM в Windows NT, позволявшую неавторизованным пользователям получить права SYSTEM. Проблема затрагивала все x86-варианты ядра Windows NT, начиная с 1993 года, и все 32-разрядные версии NT, 2000, XP, Server 2003, Vista, Server 2008 и Windows 7. Им был опубликован эксплойт-пример. До выхода официального патча обход заключался в отключении поддержки 16-разрядных приложений (что препятствовало запуску устаревших программ для DOS и Windows 3.1). 64-разрядные версии Windows не подвержены, поскольку там нет NTVDM. После установки патча работу VDM можно было включить обратно.

Ограничения

В Windows XP в 16-разрядной подсистеме, в отличие от более ранних версий Windows NT, введено более высокое ограничение на количество GDI-объектов на сессию, что приводит к сдвигу дескрипторов вправо на 2 бита при преобразовании из 32 в 16 бит. В итоге максимальный допустимый дескриптор не может превышать 14 бит, и программы, получившие больший, аварийно завершают работу.

В целом VDM и аналогичные технологии недостаточно хорошо подходят для старых DOS-игр на современных ПК. Эмуляция реализует только основные периферийные устройства, например, поддержка звука в NTVDM ограничена, высокая частота обновлений экрана не поддерживается, графические режимы большей чёткости отсутствуют. Из-за высокой скорости процессора большинства современных машин работы, ориентированные на ожидание, завершаются слишком рано, что либо приводит к слишком быстрому исполнению программ, либо к нераспознаванию периферии.

Отсутствие в архитектурах x64 и AArch64

В процессорах x86-64 (64-разрядных x86), виртуальный режим 8086 доступен только в режиме совместимости с 16-/32-разрядными ОС — в родном 64-разрядном (long mode) его нет. NTVDM отсутствует в 64-разрядных версиях Windows, в том числе для DOS-программ, так как NTVDM требует VM86-режим вместо local descriptor table, необходимого для адресации 16-разрядных сегментов. NTVDM также не реализован для Windows с архитектурой AArch64 (или ARM64), таких как Windows RT, поскольку Microsoft не выпустила полноценный эмулятор для этой несовместимой архитектуры.

Хотя NTVDM не поддерживается в x86-64 и AArch64-версиях Windows, запуск 16-разрядных программ возможен с помощью программ виртуализации, например, Windows XP Mode в старших редакциях Windows 7 или VMware Workstation. Также применяются реализации, основанные на коде ReactOS, или OTVDM (WineVDM) — 16-разрядный интерпретатор Windows на основе эмуляции MAME для i386 и компонентов совместимости Wine.

WineVDM

VDM включён в состав Wine и CrossOver для Linux и macOS под названием WineVDM. Реализован и для Windows, поскольку 64-разрядные версии Windows больше не содержат NTVDM.[1].

Примечания

Литература

  • Pietrek, Matt (август 1998). “Under The Hood”. Microsoft Systems Journal [англ.]. Архивировано из оригинала 2017-07-13. Дата обращения 2024-06-13. Проверьте дату в |date= (справка на английском)