Почему 64-разрядная ОС не может работать с 16-разрядным приложением?

Почему это:

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

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

  • Как отключить спящий режим через CMD?
  • Подключение к двум сетевым сетям с одной картой
  • Установите Adobe Flash 64-бит в IE8 на W2K8 R2
  • Повреждение файлов после копирования файлов в Windows 7 64 бит с использованием двух методов
  • Как сделать Windows 7 менее агрессивным в кэшировании памяти?
  • Как определить причину возобновления спящего режима в Windows 7?
  • Теперь я установил 64-разрядную версию Windows 7. Почему не удается запустить те же самые приложения?

  • Повреждение файлов после копирования файлов в Windows 7 64 бит с использованием двух методов
  • Была ли Windows 95 операционной системой?
  • Команда Linux для возврата числа бит (32 или 64)?
  • Можно ли установить Windows 10 на Android-устройство?
  • Windows 7 64-бит, показывающий 12 ГБ (7,99 ГБ)
  • Проверка Office 2010 Professional Plus - сбой активации продукта
  • 6 Solutions collect form web for “Почему 64-разрядная ОС не может работать с 16-разрядным приложением?”

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Давайте будем гением компьютера.