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


38

なぜそれは:

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

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

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


3
これは、ビットとは関係がなく、ゲストオペレーティングシステムとは関係があると思います。具体的にどのOSを指しているのですか?
PekkaはGoFundMonicaを

DOSBoxで実行されますか?
ペングア

1
DOSBOXと呼ばれるユーティリティがあります。これは、16ビットプログラムに作業用の仮想16ビットコンピューターを提供する16ビットエミュレーターであり、無料です。

私はPekkaに同意します。事実は、64ビット(ハードウェア)システム 16ビットコードを実行できるということです(OSがそのように設計されていれば、1ビットコードも)。実際の問題は、ポインターサイズの違いなどにより、CPUが16ビットコードを直接実行できないことですが、これらの問題はOSによって抽象化できます。この制限は、Microsoftが物事を単純化するために課した人為的な制限です(ただし、32ビットコードがまだ多くあるため、まだ32ビットをエミュレートしています)。問題なく16ビットコードを実行できる他のOS(* nix?)があります。
Synetech

WindowsをすべてのOSと混同しています。
ケンシャープ

回答:


24

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

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


6
ウィキペディアからの引用:64ビットアーキテクチャ用のWindows NT(x64およびIA-64)のバージョンにはNTVDMが含まれておらず、DOSまたは16ビットWindowsアプリケーションを実行できません。これは、x86-64 CPUでは、仮想8086モードはレガシーモード(16ビットおよび32ビットオペレーティングシステムの実行用)でのみサブモードとして使用でき、ネイティブの64ビットロングモードでは使用できないためです。レガシーモードに切り替えるには、CPUのハードリセットが必要です。したがって、これまでNTVDMが機能してきた唯一の方法は利用できなくなり、完全なVMが十分にあるため、NTVDMは削減されました。
ジョーイ

5
うん、彼らがV86モードをダンプしたとは信じられない。同様に、リアルモードを完全に停止し、32/64ビットブートローダーを要求する場合もあります。
ブライアン・ノブラウフ

5
M. Knoblauch、まさにそれがすでに起こったことです。 EFIファームウェアを搭載した最新のx86マシンは、最初の数命令で非現実モードから64/32ビット保護モードに直接移行します。 ブートローダーは、実際には64/32ビットのプロテクトモードプログラムです。それがEFIブートアプリケーションです。プロセスのどこでもリアルモードまたはv8086保護モードは使用されません。
JdeBP

3
-1。WINEは、64ビットLinuxでのVM86モードでの16ビットWindowsアプリの実行をサポートしています。スクリーンショットV86-64プロジェクトページ。Mehrdadの答えは、より説得力のある理由のようです。
ヒューアレン

3
@HughAllen:現在、そのページには「現在、Linuxカーネルの64ビットバージョンは、これらのプロセッサのネイティブ動作モード(ロングモード)ではサポートされていないため、V86モードのサポートがありません」と書かれています。「このパッチは非常に実験的です。」簡単な答えは、16ビットコードを実行することは可能ですが、ロングモードを完全に終了することにより、実行するのは賢明ではないということです。
ハリージョンストン

14

なぜなら、64ビットハンドル32の最下位ビットを有しています

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

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

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

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


3
@ジョーイ:あなたの言っていることが理解できません。OSが64ビットWindowsの場合、16ビットアプリケーションはその上で実行できません。ここで、それらが "DOS"または "Windows"アプリケーションであるという事実がどのように変化するかわかりません。どちらにしても、アプリケーションによってハンドルを切り捨てる必要があります。
Mehrdad

1
DOSアプリケーションにはハンドルがありません。実際、彼らは(通常)Windows上で実行していることさえ知りません。
ジョーイ

1
...実際には、Win16コードでさえ問題になりすぎないはずです。必要なのはルックアップテーブルだけです。
ハリージョンストン

1
@ハリージョンストン:あなたは問題を見逃していると思います。アプリケーションが呼び出したときEnumWindowsに、システムに2 ^ 16を超えるウィンドウがある場合、想像上の「ルックアップテーブル」で何が起こると思いますか。
Mehrdad

1
私は、ウィンドウハンドルではなく、記事に従ってカーネルハンドルについて話していました。それらは完全に異なるものです。16ビットアプリケーションでも32ビットウィンドウが表示されますか?メッセージ構造が異なるため、考えにくいようです。16ビットアプリに32ビットwParamを含むメッセージが送信された場合はどうなりますか?また、msdn.microsoft.com
en

10

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

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

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


14
エミュレーションは行われていません-x86 / 64はこれらをネイティブに実行できます。ただし、APIサンクが行われています。マイクロソフトは、この機会を利用して、かなり古く、ほとんど使用されていないテクノロジを廃止しました。
クリスK

@Chris Kaminski-アーキテクチャの決定として、x86対x64のように「大丈夫-それはWindows 7であり、16ビットプロセスはもう実行していません」と言って驚いた。特に7に組み込まれた「Windows XP Mode」では、x86バージョンでもサポートを削減するのに最適な時期のようです。
SqlRyan

@Chris Kaminski:もう少し考えてから、何らかのAPIをいじるだけでなく、エミュレートする必要があると思います。異なるビットビルドのコードをネイティブに実行できる場合、x64で32ビットアプリを実行するWow64が必要になるのはなぜですか?
SqlRyan

@darthcoder:CPUは、ロング(64ビット)モードのNTVDMで必要な仮想8086モードをサポートしていません。したがって、NTVDMは完全なVMになり、すべてをエミュレートするか、カットする必要があります。既に十分なVMが存在するため(MSにもVMがあります)、それは難しい決定ではありませんでした。私はそれが何歳だったか、どれだけ使われたかには関係ないと思います。
ジョーイ

rwmnau:WoW64では、エミュレーションは行われていません(Itaniumを除く)。x64-64 CPUは引き続き32ビット命令をサポートしているため、Windowsが行う必要のあるほぼすべての作業は、CPUを32ビットモードに切り替えて、いくつかのポインターで混乱させることです。
ジョーイ

3

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


-1。16ビットモードアドレッシング、つまり16ビットセグメントは、ローカル記述子テーブルを通じてサポートされます。。実際、Linux上のwinedvmはまさにそれを行います!otvdmと呼ばれる非公式の代替品もあります。
user2284570

まあ、私の理解によると、それ(ワインソリューション)にはCPUエミュレータが含まれています。したがって、仮想8086モードは使用していません。これは、DOSBOX(Win16を使用)のように、PC全体をエミュレートすることなく、NTVDMに実装できる可能性のあるソリューションです。また、16ビット保護モードがロングモードでサポートされていると言う場合、Win16リアルモードアプリはどうですか?
MichaelS

エミュレータが含まれていますが、ローカル記述子テーブルを変更する方法がWindowsで見つかった場合、エミュレーションはまったく必要ありません。リアルモードについては、Dosemu(少なくともLinuxバージョン)によって行われるような方法でエミュレートすることもできます。Ntvdmは当初、以前のバージョンのWindowsでサポートされていたMipsやPowerPcなどのプラットフォームでDosプログラムを実行できるように設計されました。これはオプションの機能であり、コンパイル時に有効にする必要があります。そして、ソースコードが漏洩して、誰かがそれをできるようになったようです:columbia.edu/~em36/ntvdmx64.html
user2284570

3

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

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

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


1
64ビットWindowsにNTVDMがないためです。CPUは引き続き互換モードで16ビットコードを実行できます。Intelマニュアルから:「互換モード(IA-32eモードのサブモード)—互換モードでは、ほとんどのレガシー16ビットおよび32ビットアプリケーションを64ビットオペレーティングシステムで再コンパイルせずに実行できます」
phuclv

私が理解しているように、互換モードでは16ビット保護モードが許可されますが、仮想8086モードは許可されません。
プラグウォッシュ

2

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


これには明らかにそれの価値は、それは彼らがすでに持っているものを使用しますが、x86-64のために必要とされるように起因する無仮想8086モードに(それを再実装しないように、Windows 7の32ビット版はまだそれをサポートしている以外の理にかなっている
Earlz

「複雑なコードベースを維持したくない」と考えていました。16ビットのままにしていた場合、80年代に遡るソフトウェアをサポートする必要があったかもしれません。これには、Lotus 1-2-3が引き続き機能するように、いハッキングを行うことが含まれます。
ジョープランテ

@Earlzはい、しかしこれは本当の答えだと思います。16ビットのローカル記述子テーブルにアクセスするための実際のソリューションは、Vm86モードではなく、直接行うことです。マイクロソフトは単にコードの移植を煩わしませんでした。実際、ネイティブの64ビットWindows用に設計されたNtᴠᴅᴍ非公式のソフトウェア置換があります
user2284570
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.