Виртуальные машины DOS ( VDM ) — это технология, которая позволяет запускать 16-битные/32-битные программы DOS и 16-битные программы Windows, когда уже запущена другая операционная система , управляющая оборудованием.
Виртуальные машины DOS могут работать либо исключительно с помощью типичных методов эмуляции программного обеспечения (например, динамической перекомпиляции ), либо могут полагаться на виртуальный режим 8086 процессора Intel 80386 , который позволяет программному обеспечению реального режима 8086 работать в контролируемой среде, перехватывая все операции, которые включают доступ к защищенному оборудованию и перенаправляя их в обычную операционную систему (как исключения ). Затем операционная система может выполнить эмуляцию и возобновить выполнение программного обеспечения DOS.
VDM обычно также реализуют поддержку для запуска 16- и 32-разрядного программного обеспечения защищенного режима ( расширители DOS ), которое должно соответствовать интерфейсу защищенного режима DOS (DPMI). [1]
Когда программе DOS, работающей внутри VDM, требуется доступ к периферийному устройству, Windows либо разрешит это напрямую (редко), либо предоставит программе DOS драйвер виртуального устройства (VDD), который эмулирует оборудование с помощью функций операционной системы. VDM будет систематически иметь эмуляции для контроллеров прерываний Intel 8259A , микросхем таймера 8254 , контроллера DMA 8237 и т. д. [1]
В январе 1985 года Digital Research совместно с Intel анонсировали Concurrent DOS 286 1.0 [2] , версию Concurrent DOS, способную запускать программы DOS реального режима в защищенном режиме 80286. [ 2] Метод, разработанный на процессорных чипах степпинга B-1, однако, в мае 1985 года перестал работать на процессорах степпинга C-1 и последующих степпингах незадолго до того, как Digital Research собиралась выпустить продукт. Хотя с степпингом E-1 Intel начала решать проблемы в августе 1985 года, так что «режим эмуляции 8086» Digital Research снова заработал , используя недокументированную инструкцию процессора LOADALL [3] [4], он был слишком медленным, чтобы быть практичным. Изменения микрокода для степпинга E-2 снова улучшили скорость. [5] [6] Эту раннюю реализацию можно рассматривать как предшественника реальных виртуальных машин DOS.
В конце концов, Concurrent DOS 286 была переработана из потенциальной настольной операционной системы в FlexOS 286 для промышленного использования в 1986 году. [7] [8] Она также была лицензирована IBM для своей ОС 4680 в 1986 году. [9] [10]
Когда стал доступен процессор Intel 80386 с виртуальным режимом 8086 (в виде образцов с октября 1985 года и в больших количествах с июня 1986 года), Digital Research переключилась на его использование для запуска программ DOS реального режима на виртуальных машинах DOS в защищенном режиме под Concurrent DOS 386 1.0 (февраль 1987 года) [11] и FlexOS 386 1.0 (июнь 1987 года). [12] Однако архитектура этих многопользовательских многозадачных операционных систем защищенного режима сама по себе не была основана на DOS.
Concurrent DOS 386 позже был развит как Multiuser DOS (с 1991 года) и REAL/32 (с 1995 года). FlexOS 386 позже стал 4690 OS в 1993 году.
В отличие от этих операционных систем защищенного режима, DOS по умолчанию является операционной системой реального режима, переключающейся в защищенный режим и виртуальный режим 86 только от имени менеджеров памяти и расширителей DOS, чтобы обеспечить доступ к расширенной памяти или отобразить в памяти первый мегабайт, который доступен обычным программам DOS.
VDM на базе DOS появились в Windows/386 2.01 от Microsoft в сентябре 1987 года. [13] Виртуальные машины DOS на базе DOS также присутствовали в Windows 3.0 , 3.1x и Windows for Workgroups 3.1x, работающих в 386 Enhanced Mode , а также в Windows 95 , 98 , 98 SE и ME . Одной из характеристик этих решений, работающих поверх DOS, является то, что структура памяти, показанная внутри виртуальных машин DOS, представляет собой виртуальные экземпляры системы DOS и конфигурации драйвера DOS, запущенные до загрузки многозадачности, и что запросы, которые не могут быть обработаны в защищенном режиме, передаются в системный домен для выполнения базовой системой DOS.
Аналогично Windows 3.x 386 Enhanced Mode по архитектуре, EMM386 3.xx Novell DOS 7 , [1] [14] Caldera OpenDOS 7.01 , [14] [15] DR-DOS 7.02 [16] (и более поздние версии) также используют основанные на DOS VDM для поддержки упреждающей многозадачности нескольких приложений DOS, когда EMM386 /MULTIиспользуется эта опция. [14] [15] [16] Этот компонент разрабатывался в Digital Research / Novell с 1991 года [nb 1] под кодовым названием «Vladivar» (первоначально это был отдельный драйвер устройства KRNL386.SYS[1] [14] вместо модуля EMM386). Хотя изначально он был разработан для следующей основной версии DR DOS, выпущенной как Novell DOS 7 в 1994 году [1] [14], он также использовался в никогда не выпущенных проектах DR DOS «Panther» и « Star Trek » в 1992/1993 годах.
Несколько виртуальных машин DOS (MVDM) используются в OS/2 2.0 и более поздних версиях с 1992 года. [1] [4] OS/2 MVDM значительно мощнее, чем NTVDM. Например, поддерживаются блочные устройства, и различные версии DOS могут быть загружены в OS/2 MVDM. [17] В то время как OS/2 1.x DOS box был основан на DOS 3.0, OS/2 2.x MVDM эмулируют DOS 5.0. [1]
Бесшовная интеграция приложений Windows 3.1 и более поздних Win32s в OS/2 — это концепция, внешне похожая на бесшовную интеграцию XP Mode на основе Windows Virtual PC в Windows 7. Редиректор в «гостевой» VDM или NTVDM позволяет получить доступ к дискам OS/2 или NT «хоста». Приложения в «гостевой» системе могут использовать именованные каналы для связи со своим «хостом». [18]
Из-за технических ограничений приложения DOS и 16-разрядной Windows под OS/2 не могли видеть более 2 ГБ места на жестком диске; [19] это было исправлено в ArcaOS 5.0.4. [20]
NTVDM является системным компонентом всех редакций IA-32 семейства Windows NT с 1993 года с выпуском Windows NT 3.1 . Он позволяет выполнять 16-битные Windows и 16-битные / 32-битные приложения DOS. Исполняемый файл пользовательского режима Windows NT 32-бит, который формирует основу для единой среды DOS (или Windows 3.x ), называется ntvdm.exe . [1]
Для выполнения программ DOS NTVDM загружает NTIO.SYS , который в свою очередь загружает NTDOS.SYS , который выполняет измененный COMMAND.COM для запуска приложения, переданного NTVDM в качестве аргумента командной строки. 16-битные системные файлы реального режима являются урезанными производными от их эквивалентов MS-DOS 5.0 IO.SYS , MSDOS.SYS и COMMAND.COM [1] со всеми жестко зашитыми предположениями о файловой системе FAT, удаленными и использующими недействительный код операции 0xC4 0xC4 для перехода в 32-битный NTVDM для обработки запросов. [1] Первоначально NTDOS сообщал программам версию DOS 30.00, [1] но вскоре это было изменено на сообщение версии 5.00 в и 5.50 в, чтобы позволить большему количеству программ работать без изменений. [1] Это справедливо даже для новейших выпусков Windows; многие дополнительные функции и команды MS-DOS, представленные в версиях MS-DOS 6.x и Windows 9x , отсутствуют.INT 21h/AH=30h
INT 21h/AX=3306h
16-разрядные приложения Windows по умолчанию все запускаются в своем собственном потоке в рамках одного процесса NTVDM. Хотя сам NTVDM является 32-разрядным процессом и упреждающе многозадачен по отношению к остальной части системы, 16-разрядные приложения в нем кооперативно многозадачны по отношению друг к другу. Когда опция «Запускать в отдельном пространстве памяти» отмечена в поле «Выполнить» или в файле ярлыка приложения, каждое 16-разрядное приложение Windows получает свой собственный процесс NTVDM и, следовательно, упреждающе многозадачно по отношению к другим процессам, включая другие 16-разрядные приложения Windows. NTVDM эмулирует вызовы и таблицы BIOS, а также ядро Windows 3.1 и 16-разрядные заглушки API. [21] 32-разрядный слой трансляции WoW преобразует 16-разрядные процедуры API.
32-битная эмуляция DOS присутствует для интерфейса защищенного режима DOS (DPMI) и 32-битного доступа к памяти. Этот уровень преобразует необходимые расширенные и расширенные вызовы памяти для функций DOS в вызовы памяти Windows NT. wowexec.exe — это уровень эмуляции, который эмулирует 16-битную Windows. В Windows 2000 и Windows XP добавлена эмуляция Sound Blaster 2.0. [22] 16-битные драйверы виртуальных устройств и драйверы блочных устройств DOS (например, RAM-диски) не поддерживаются. Межпроцессное взаимодействие с другими подсистемами может осуществляться через OLE , DDE и именованные каналы .
Поскольку виртуальный режим 8086 недоступен на процессорах, не основанных на x86 (в частности, MIPS , DEC Alpha и PowerPC ), NTVDM вместо этого реализован как полный эмулятор в этих версиях NT, используя код, лицензированный у SoftPC компании Insignia . [23] [1] До Windows NT 3.51 доступна только эмуляция 80286. С Windows NT 4.0 была добавлена эмуляция 486. [24]
NTVDM не включен в 64-разрядные версии Windows или версии на базе ARM32, такие как Windows RT или Windows 10 IoT Core. Последняя версия Windows, включающая этот компонент, — Windows 10 , поскольку Windows 11 прекратила поддержку 32-разрядных процессоров.
Следующие команды являются частью подсистемы Windows XP MS-DOS. [18]
В январе 2010 года исследователь безопасности Google Тэвис Орманди выявил серьезную уязвимость безопасности в реализации VDM в Windows NT, которая позволяла непривилегированным пользователям повышать свои привилегии до уровня SYSTEM , что было отмечено как применимое к безопасности всех версий x86 ядра Windows NT с 1993 года. Это включало все 32-разрядные версии Windows NT, 2000, XP, Server 2003, Vista, Server 2008 и Windows 7. [25] Орманди опубликовал экспериментальный эксплойт для этой уязвимости. [26] До выпуска исправления безопасности Microsoft обходным путем для этой проблемы было отключение поддержки 16-разрядных приложений, что не позволяло запускать старые программы (написанные для DOS и Windows 3.1). 64-разрядные версии Windows не затронуты, поскольку подсистема NTVDM не включена. [27] [28] После того, как исправления безопасности Microsoft были применены к затронутым операционным системам, VDM можно было безопасно включить снова. [nb 2]
В 16-разрядной подсистеме Windows XP (но не в более ранних версиях Windows NT) существует ограничение из-за повышенного лимита на сеанс для объектов GDI, что приводит к сдвигу дескрипторов GDI вправо на два бита при преобразовании их из 32 в 16 бит. [29] В результате фактический дескриптор не может быть больше 14 бит, и, следовательно, 16-разрядные приложения, которым система GDI выдала дескриптор больше 16384, аварийно завершают работу с сообщением об ошибке. [29]
В целом, VDM и подобные технологии неудовлетворительно запускают большинство старых игр DOS на современных компьютерах. Эмуляция предоставляется только для самых основных периферийных устройств, часто реализованных не полностью [ требуется ссылка ] . Например, эмуляция звука в NTVDM очень ограничена. Версии Windows семейства NT обновляют реальный экран только несколько раз в секунду, когда программа DOS записывает на него данные, и они не эмулируют графические режимы с более высоким разрешением. Поскольку программное обеспечение в основном работает на собственной скорости центрального процессора, все циклы синхронизации будут преждевременно истекать. Это либо заставляет игру работать слишком быстро, либо заставляет программное обеспечение даже не замечать эмулируемые аппаратные периферийные устройства, поскольку оно не ждет достаточно долго ответа.
В процессоре x86-64 виртуальный режим 8086 доступен как подрежим только в его устаревшем режиме (для запуска 16- и 32-разрядных операционных систем), а не в собственном 64-разрядном длинном режиме . [30] NTVDM не поддерживается в редакциях x86-64 Windows, [31] включая программы DOS, [32] поскольку NTVDM использует режим процессора VM86 вместо локальной таблицы дескрипторов для включения 16-битного сегмента, необходимого для адресации. [33] NTVDM также недоступен в версиях Windows AArch64 (или ARM64) (например, Windows RT ), поскольку Microsoft не выпустила полноценный эмулятор для этого несовместимого набора инструкций, как это было в предыдущих несовместимых архитектурах.
Хотя NTVDM не поддерживается в версиях Windows x86-64 и AArch64, их все равно можно запустить с помощью программного обеспечения виртуализации , такого как Windows XP Mode в недомашних версиях Windows 7 или VMware Workstation . Другие методы включают использование NTVDMx64, [34] неофициального порта эмулированной реализации NTVDM из просочившегося исходного кода Windows NT 4.0 для платформ, отличных от x86, [23] или OTVDM (WineVDM), 16-битного интерпретатора Windows, основанного на эмуляции i386 MAME и 16-битной части популярного слоя совместимости Windows, Wine (см. раздел о WineVDM ниже). [35]
VDM включен в Wine и CrossOver для Linux и Mac OS X, известный как WineVDM (также известный как OTVDM). Он также был портирован на саму Windows, поскольку 64-битные версии Windows не включают подсистему NTVDM (см. выше). [36]
"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\AppCompat\VDMDisallowed"=dword:00000000
.{{cite book}}
: |work=
игнорируется ( помощь ) (Примечание. NWDOSTIP.TXT — это всеобъемлющая работа по Novell DOS 7 и OpenDOS 7.01 , включающая описание многих недокументированных функций и внутренних компонентов. Она является частью еще более обширной коллекции MPDOSTIP.ZIP автора, которая поддерживалась до 2001 года и распространялась на многих сайтах в то время. Приведенная ссылка указывает на более старую версию файла NWDOSTIP.TXT, преобразованную в HTML.) mpdostip.zip{{cite web}}
: CS1 maint: неподходящий URL ( ссылка )