Почти каждое старое руководство по компьютеру начала двухтысячных содержит строку вроде "запустите эту программу в режиме совместимости", а ветераны добавляют: да просто кликните, под тридцать вторым битами всё работало. Потом наступила эпоха 64-битных Windows, и та же самая программа стала выдавать окно с немым отказом: эта программа не может быть запущена на вашем ПК. Не устаревшая игра, не кривой установщик, а фундаментальная стена, проросшая между двумя вычислительными эпохами. На границе этих эпох стоит неприметный компонент NTVDM, виртуальная DOS-машина поколения Windows NT, прозрачно обслуживавшая шестнадцатибитный мир добрых два десятка лет, и его исчезновение отрезало старые программы от современных компьютеров навсегда.

Что делал слой NTVDM и почему без него было нельзя

Когда в 1993 году Microsoft выпустила первую Windows NT, у инженеров была изящная проблема. Система строилась заново на защищённом режиме процессора, с многозадачностью и контролем памяти, но вокруг ходили миллионы пользователей, чьи любимые программы были шестнадцатибитными и кричали прямо в железо через прерывания. Просто распрощаться с этим наследием означало потерять склады, бухгалтерии и игровые архивы всей страны.

Ответом стал планировочный фокус: виртуальная DOS-машина, NTVDM. Это отдельный процесс Windows, внутри которого эмулировалась целая среда исполнения старого образца: память с её первым мегабайтом и знаменитыми шестьюстами сорока килобайтами, досовские прерывания, виртуальные версии контроллера прерываний Intel 8259A, таймера 8254, контроллера прямого доступа к памяти 8237 и прочей классической периферии. Старая программа видела вокруг себя знакомую апартаментную планировку восьмидесятых, а настоящая Windows между делом сама подменяла все опасные вызовы, аккуратно исполняя их средствами большой системы.

Ключевую роль играл специальный режим процессора, virtual 8086, который Intel встроила ещё в 80386. Этот режим позволял настоящему шестнадцатибитному коду работать быстро и почти на честных условиях, процессор перехватывал только обращения к защищённому железу и передавал их операционной системе для мягкой имитации. Благодаря VM86 старые программы внутри NTVDM работали не в черепашьем темпе полной программной эмуляции, а со скоростью, практически равной родному железу.

Странная двухэтажность тридцатидвухбитного мира

NTVDM решал только половину задачи. Значительная часть популярного софта девяностых была написана под Windows 3.x, то есть тоже была шестнадцатибитной, но уже для оконной среды, а не для голой DOS. Для этих программ рядом с NTVDM строился второй слой под прозвищем WOW, Windows on Windows, показывающий шестнадцатибиткам вид родного менеджера окон и подменяющий их вызовы вызовами тридцатидвухбитного ядра.

В типовой тридцатидвухбитной Windows эта конструкция жила вместе: щёлкнули по старой игре, авто загружается процесс NTVDM, внутри него wowexec для оконных приложений, и всё это незаметно дышит у пользователя перед глазами. Люди часто вообще не знали, что их любимая программа девяностых технически работает в виртуальной машине. Иллюзия была настолько убедительной, что её раскрытие вызывало удивление у самих администраторов при первом разборе диспетчера задач.

Служба этих слоёв растянулась на поколения. Windows NT, 2000 и XP уверенно запускали и DOS-утилиты, и шестнадцатибитные окна, а позже и некоторые конфигурации Vista и 7 в тридцатидвухбитном виде сохраняли ту же совместимость. История, казалось, могла тянуться бесконечно, если бы не смена архитектуры процессоров.

Железная причина, которая и погубила шестнадцатибитный мир

Вот мы и подошли к самому главному вопросу: почему 64-битная Windows не может запустить DOS-программу, даже если очень попросить. Дело не в воле производителя, а в анатомии процессора. Когда индустрия ушла в 64 бита, инженеры AMD и Intel растянули архитектуру, добавив длинный режим, long mode. В этом режиме процессор приобретает широкие регистры и новые возможности, но теряет один старый трюк: виртуальный режим 8086 под long mode недоступен. Вы можете исполнять 64-битный и 32-битный код, но не реальный шестнадцатибитный с его дедовской адресацией.

Пока процессор работал в тридцатидвухбитном или смешанном режиме, VM86 был жив, и NTVDM имел фундамент. Как только Windows стартует как полноценная 64-битная система, фундамент исчезает. Обойти эту стену программными ухищрениями в рамках полноценной Windows нельзя, потому что сами ворота в шестнадцатибитный реальный режим аппаратно закрыты, пока система живёт в длинном режиме.

Из этого же вытекает и судьба WOW: слой для шестнадцатибитных Windows-программ тоже опирался на те же механизмы, и в 64-битных редакциях его нет. Поэтому на 64-битной Windows невозможно запустить ни шестнадцатибитную DOS-игру, ни шестнадцатибитный установщик, какими бы правами администратора вы ни размахивали.

Чем живут любители старых программ вместо NTVDM сегодня

Когда аппаратная почва исчезла, пришлось строить её программно. Сообщество ответило DOSBox, полноценным эмулятором процессора 386 и 486 со всем периферийным хозяйством: звуковая карта Sound Blaster, видеорежимы, джойстики. DOSBox не пытается отразить реальный режим, он целиком рисует компьютер в софте, поэтому его не интересует, в каком режиме работает настоящая система. Именно через такие эмуляторы старые DOS-игры и живут на компьютерах 64 бит: они не уносят шестнадцатибитный код на родное железо, а создают рядом ласковую копию старого железа и дают коду в ней побыть.

Появились и более тяжёлые обходы: виртуальные машины вроде VirtualBox, внутри которых человек устанавливал честный FreeDOS или старую 32-битную Windows, а в ней уже сидела родная совместимость. Принцип тот же: раз нельзя заставить NTVDM работать в длинном режиме, надо вокруг современной системы построить комнату со старой.

Откуда вообще взялась идея виртуальных DOS-машин

Сам принцип, на котором вырос NTVDM, родился задолго до Windows NT. Ещё в январе 1985 года компания Digital Research вместе с Intel демонстрировала Concurrent DOS 286, раннюю попытку исполнять DOS-программы под защищённым режимом процессора 80286. Затея споткнулась о брак конкретных ревизий чипа: на одном степпинге трюк работал, на следующем отваливался, и в релиз технология пошла урезанной и медленной. Настоящий расцвет случился с появлением процессора 80386, в котором Intel впервые реализовала полноценный виртуальный режим 8086. С этого чипа Digital Research выпустила Concurrent DOS 386 в 1987 году, а Microsoft тем же годом выкатила Windows/386, внутри которой уже жили целые DOS-совместимые виртуальные машины.

С тех пор в VDM упражнялись многие. Windows 3.0 и 3.1 в расширенном режиме 386 умели держать несколько виртуальных DOS-сеансов разом, Windows 95 и 98 сохранили ту же технику, а операционная система OS/2 пошла дальше всех и построила MVDM, множественные виртуальные DOS-машины, способные загружать внутрь хоть несколько разных версий DOS одновременно. На этом фоне NTVDM из состава Windows NT выглядит не изобретением, а зрелой реализацией хорошо известной идеи, просто доведённой до промышленной надёжности.

Забавная деталь: в режиме совместимости виртуальная машина не притворялась DOS до последней буквы. Если какой-то запрос программы нельзя было исполнить в защищённом режиме, ВDM тихо передавала его вниз, в родную систему нижнего этажа, которая исполняла просьбу и возвращала результат. Вся конструкция будто бы замешана на этикете: гость в старом платье ходит по современному дому, а прислуга в коридоре деликатно подменяет ему старые привычки новыми службами.

Как выглядит отказ от запуска на современных системах

Постановка вопроса на 64-битной Windows проста и безапелляционна. Двойной щелчок по exe-шнику времён DOS или Windows 3.x приводит к вежливому окну, сообщающему, что приложение невозможно запустить на этом ПК, и предлагающему связаться с издателем. Никаких деталей, никаких намёков, в чём именно закавыка: система даже не пытается проработать файл, потому что на аппаратном уровне не существует режима, в котором этот код мог бы быть исполнен под управлением длинного режима.

Отдельная комедия начинается с установщиков. Очень многие программы эпохи Windows 95 и 98 формально были тридцатидвухбитными, но поставлялись с шестнадцатибитным инсталлятором. В результате сама программа могла бы прекрасно работать на современной системе, а установиться не могла: её установщик упирался в ту же стену. Умельцы этого периода запомнили целое поколение трюков с ручным распаковыванием дистрибутивов и пересадкой реестра.

Как понять, что программа попала под запрет архитектуры

Есть несколько косвенных примет, быстро выдающих шестнадцатибитное наследство. Возраст дистрибутива до середины девяностых, инсталлятор весом в считаные мегабайты, требование дискеты или SETUP.EXE, древняя справка в формате HLP, упоминание Sound Blaster или джойстика в документации: по этим признакам опытный человек заранее предсказывает, что на 64-битной Windows прямой запуск не светит. Догадку легко проверить и инструментально: современные анализаторы исполняемых файлов показывают разрядность образа, и если он объявлен как 16-bit NE или MZ без PE-заголовка, дальнейший путь лежит только в эмулятор или виртуальную машину со старой системой.

Короткий словарик для тех, кто хочет разобраться глубже.

Чтобы тема не осталась абстракцией, полезно узнавать в лицо её главных действующих героев. NTVDM это процесс виртуальной DOS-машины в 32-битной Windows NT и её наследницах. WOW, Windows on Windows, слой для шестнадцатибитных Windows-программ рядом с ней. VM86 это аппаратный режим процессора с 80386 по нынешние дни, дающий двадцатимегагерцовой программе иллюзию родного железа. DOSBox это полный программный эмулятор компьютера, который преспокойно работает сегодня в любом режиме процессора. FreeDOS это живая свободная версия DOS для тех, кому нужна настоящая дисковая система, а не музейная витрина. Разложив эти пять имён по полочкам, вы всегда поймёте, о чём на самом деле говорит совет из интернета.

Чему учит исчезновение NTVDM.

История этого компонента очень показательна для понимания логики развития платформ:

  1. Совместимость долго казалась бесплатной: она держалась на режиме процессора, который никого не утруждал, пока решения принимались на уровне микрокода;
  2. Как только архитектура проапгрейдилась, бесплатный режим стал первой утратой, и вся пирамида эмуляций рассыпалась за один апгрейд;
  3. Программная эмуляция оказалась вечной, а аппаратная совместимость временной: DOSBox с его программным CPU пережил уже несколько смен железа и выглядит бессмертным;
  4. Цена того, чтобы уметь всё старое, взлетела с нескольких процентов быстродействия до отдельного виртуального мира, и пользователь сам решает, стоит ли это конкретной игры.

Урок на деле трезвый: никогда не считайте, что старое всегда будет под рукой. Если у вас есть программы, жизненно важные для работы или дорогие сердцу, держите их копии вместе с рабочим окружением, ведь срок службы аппаратных режимов короче, чем срок службы чувств и архивов.

Почему эпоха NTVDM заслуживает отдельной витрины в памяти.

NTVDM не попадает в учебники как культовый продукт, у него нет красивой коробки и фанатских клубов. Между тем двадцать лет именно этот слой был тем мостом, по которому шестнадцатибитная эпоха без боли ходила за руку с эпохой тридцатидвухбитной. Он принимал на себя удары устаревшего кода, кормил виртуальными прерываниями старые бухгалтерии, давал поиграть в классику тем, кто вырос на ней, и всё это исполнял незаметно, не требуя благодарности. Его отключение было не злой волей, а закономерным следом смены аппаратной парадигмы, но это не отменяет простой истины: мы перешли в 64 бита, и за спиной осталась дверь, которую захлопнул не администратор, а сам процессор.

И всё же эта дверь оставила после себя полезную привычку. Сегодня, когда вы слышите про эмулятор старой приставки, программный компьютер в браузере или виртуальную машину для устаревшей бухгалтерии, знайте: всё это же было сказано однажды компонентом NTVDM, который просто сделал это первым массовым способом. Уметь сохранять прошлое внутри настоящего - редкое и недешёвое мастерство вычислительной техники, и именно за него нашему неприметному герою положен памятный знак.