38

Почему это так:

  • 32-разрядная ОС, установленная на 64-разрядном процессоре, может запускать старые 16-разрядные приложения,
  • но если вы устанавливаете 64-битную ОС, она не может запускать эти приложения напрямую и нуждается в какой-то эмуляции (это не всегда работает идеально)?

Если быть более точным, у меня есть 64-разрядный процессор (Intel Core 2 Duo). Когда у меня были установлены Windows XP и Windows 7 (обе 32-битные), они могли запускать старые приложения для DOS и 616-битные Windows.

Теперь я установил 64-разрядную версию Windows 7. Почему он больше не может запускать те же приложения?

6 ответов6

26

Насколько я понимаю, это потому, что при работе в длинном режиме (собственно x64) сам процессор не поддерживает переход в 16-битный режим. Смотрите Википедию. Таким образом, для поддержки 16-битного режима NTVDM (16-битный уровень в Windows) должен полностью эмулировать 16-битный процессор.

Я предполагаю, что они взвесили повторную реализацию уровня эмуляции по сравнению с использованием уже существующего программного обеспечения для виртуализации (VirtualPC, VirtualBox), и было решено сократить VDM.

15

Поскольку 64-битные дескрипторы имеют 32 значащих бита:

Обратите внимание, что 64-разрядная версия Windows не поддерживает запуск 16-разрядных приложений для Windows.
Основная причина в том, что дескрипторы имеют 32 значащих бита в 64-битной Windows.
Поэтому дескрипторы не могут быть усечены и переданы 16-разрядным приложениям без потери данных.

В Windows программы передают "дескрипторы" ОС и наоборот (это числа, которые ОС использует для уникальной идентификации конкретного ресурса, такого как окно).

Для поддержки 16-битных программ 32-битная Windows генерирует только дескрипторы, которые имеют 16 значащих битов - 16 старших бит игнорируются ОС (даже если программы не используют этот факт в своих интересах). Таким образом, ни одна программа не может взаимодействовать с более чем 2 16 объектами, что на самом деле довольно мало.

Однако, чтобы улучшить это, 64-битная Windows увеличила количество значащих бит в дескрипторе до 32. Но теперь это означает, что дескрипторы нельзя передавать в 16-битные программы без потери информации. Таким образом, 16-битные программы не могут работать в 64-битной Windows.

11

Для Windows это потому, что версии ОС x86 включают 16-битную эмуляцию, которая позволяет им запускать эти старые процессы DOS. В версиях x64 им уже нужно эмулировать выполнение x86 (они называют его WoW64), чтобы позволить запускаться 32-разрядным процессам, и я предполагаю, что использование Wow64 для дальнейшей эмуляции 16-разрядного эмулятора вызвало слишком много проблем.

Несколько распознанных 16-битных процессов будут запущены, потому что эмуляция жестко запрограммирована, но остальные не работают, потому что эмуляция не включена в x64.

Смотрите «Нет 16-битного кода» в статье MSKB: http://support.microsoft.com/kb/282423

3

Поправьте меня, если я ошибаюсь, но, насколько я понимаю, именно из-за проблемы Windows NTVDM использует виртуальный режим 8086. Режим совместимости на процессорах x64 (работающих в длинном режиме) поддерживает полностью «чистый» защищенный режим, 16 и 32-битный из того, что я нашел здесь: http://en.wikipedia.org/wiki/Long_mode, но не некоторые из 386 дополнений, таких как виртуальный режим 8086. Таким образом, он не поддерживается, скорее всего, потому что Microsoft не окупает перепрограммирование NTVDM, что, вероятно, потребует добавления дополнительной эмуляции, потому что некоторые приложения в 16-битном защищенном режиме могут использовать виртуальный 8086, даже если большинство этого не делают. Я полагаю, что при достаточном труде можно написать что-то быстрее, чем dosbox, работающий в длинном режиме, поскольку есть аппаратная поддержка 16-битных приложений.

1

Я думаю, что наиболее вероятной причиной является то, что лишь небольшой процент владельцев ПК действительно хотят иметь возможность запускать старые 16-битные приложения на своем новом 64-битном оборудовании. Microsoft, вероятно, полагала, что не стоит продолжать поддерживать 16-битные приложения.

1

Ситуация отличается для приложений Dos и 16-битных приложений Windows.

Для приложений Dos проблема заключается в том, что виртуальный режим 8086 недоступен в длинном режиме. Это ограничение архитектуры процессора.

Для 16-битных приложений Windows (которые работают в 16-битном защищенном режиме) причина в том, что MS не была готова выполнить работу по реализации подходящего уровня совместимости. Забавно, что Wine прекрасно способен запускать 16-битные приложения Windows на 64-битной Linux.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .