web-dev-qa-db-ja.com

64ビットOSが16ビットアプリケーションを実行できないのはなぜですか?

それはなぜですか:

  • 32ビットOSを64ビットCPUにインストールすると、古い16ビットアプリケーションを実行できます。
  • しかし、64ビットOSをインストールすると、それらのアプリケーションを直接実行できなくなり、何らかのエミュレーションが必要になります(常に完全に機能するとは限りません)。

具体的には、64ビットプロセッサ(Intel Core 2 Duo)を使用しています。 Windows XPおよびWindows 7(両方とも32ビット)がインストールされている場合、古いDOSおよび616ビットのWindowsアプリケーションを実行できました。

これで、Windows 7の64ビット版がインストールされました。なぜ同じアプリケーションをもう実行できないのですか?

40
Bob

私の理解では、ロングモード(x64ネイティブ)で実行している場合、CPU自体が16ビットモードへの移行をサポートしていないためです。 Wikipedia を参照してください。したがって、16ビットモードをサポートするには、NTVDM(Windowsの16ビットレイヤー)が16ビットプロセッサを完全にエミュレートする必要があります。

エミュレーションレイヤーの再実装と、既存の仮想化ソフトウェア(VirtualPC、VirtualBox)を使用してこれを処理することを比較検討したため、VDMを削減することにしました。

26
Matt Sieker

64ビットハンドルには32ビットの有効ビットがあるため

64ビットWindowsは、16ビットWindowsベースのアプリケーションの実行をサポートしていないことに注意してください。
主な理由は、64ビットWindowsでハンドルの有効ビット数が32であることです。
そのため、データを失うことなく、ハンドルを切り捨てて16ビットアプリケーションに渡すことはできません。

Windowsでは、プログラムは「ハンドル」をOSに渡します(その逆も同様)(OSがウィンドウなどの特定のリソースを一意に識別するために使用する番号です)。

16ビットプログラムをサポートするために、32ビットWindowsonlyは、16の有効ビットを持つハンドルを生成します-上位16ビットはOSによって無視されます(プログラムがこの事実を利用していない場合でも)。したがって、2つ以上のプログラムと対話することはできません。16 実際にはかなり低いオブジェクトです。

ただし、これを改善するために、64ビットWindowsではハンドルの有効ビット数を32に増やしました。しかし、これは、情報を失うことなくハンドルを16ビットプログラムに渡すことができないことを意味します。したがって、16ビットプログラムは64ビットWindowsでは実行できません。

14
user541686

Windowsの場合は、OSのx86バージョンに、それらの古いDOSプロセスを実行できる16ビットエミュレーションが含まれているためです。 x64バージョンでは、32ビットプロセスを実行できるようにするために、x86の実行をエミュレートする必要があります(WoW64と呼ばれます)。Wow64を使用して16ビットエミュレーターをさらにエミュレートすると、問題が多すぎると思います。

エミュレーションが処理するようにハードコードされているため、認識された16ビットプロセスの一部が実行されますが、残りはx64にエミュレーションが含まれていないため機能しません。

MSKB記事の「16ビットコードなし」を参照してください: http://support.Microsoft.com/kb/28242

10
SqlRyan

Dosアプリケーションと16ビットWindowsアプリケーションでは状況が異なります。

Dosアプリケーションの場合、問題は、ロングモードでは仮想8086モードを使用できないことです。これはCPUアーキテクチャの制限です。

16ビットWindowsアプリケーション(16ビットプロテクトモードで実行されます)の理由は、MSが適切な互換性レイヤーを実装する作業を行う準備ができていなかったためです。面白いことに、Wineは64ビットLinuxで16ビットWindowsアプリを完全に実行できます。

4
plugwash

私が間違っている場合は修正してください。ただし、理解すると、NTVDMが仮想8086モードを使用しているのは、Windows固有の問題が原因です。 x64プロセッサの互換モード(ロングモードで実行)は、「クリーン」プロテクトモードを完全にサポートします。ここで見つけたものから16ビットと32ビットです。 http://en.wikipedia.org/wiki/Long_mode =、ただし、仮想8086モードなどの386の追加の一部ではありません。そのため、MicrosoftがNTVDMを再プログラムしても効果がないため、サポートされていない可能性が高く、一部の16ビットプロテクトモードアプリケーションは仮想8086を使用できるため、エミュレーションを追加する必要があります。 16ビットアプリのハードウェアサポートがあるため、十分な労力があれば、ロングモードで実行しているdosboxよりも速いものを書くことが可能だと思います。

3
MichaelS

最も可能性の高い理由は、PC所有者のごく一部のみが実際に古い64ビットアプリケーションを新しい64ビットハードウェアで実行できることを望んでいるためだと思います。マイクロソフトは、16ビットアプリケーションのサポートを継続する間、価値がないと考えていました。

2
Stephen C