web-dev-qa-db-ja.com

Windowsの32ビットプログラムと64ビットプログラムの違いは何ですか

64ビットプログラムを32ビットコピーのWindowsで実行できないのはなぜですか?私のPCは、64ビットプログラムを実行していることをどのようにして認識しますか?プログラムには、64ビットプログラムであることをWindowsに通知するコードが含まれていますか、それともWindowsは単に実行に失敗しますか?

同じプログラムの2つのバージョンのファイルサイズに大きな違いが見られたので、コードが違うと思います。コードを変更してプログラムを実行することは可能ですか?

4
Avasyu

免責事項:私は人生でOSを書いたことがありません。より有能な誰かが答えるのを待って、 いくつかのOSDev記事 を読んでください。

プログラムには、64ビットプログラムであることをWindowsに通知するコードが含まれていますか、それともWindowsは単に実行に失敗しますか?

それは両方です。

  • すべてのWindows実行可能ファイル(.exe、.dll、…–一般にPE実行可能ファイル)には、コンパイル対象のアーキテクチャをOSに通知するヘッダーがあります。 Intel x86(16ビットまたは32ビット)またはx86_64またはItaniumまたはAlphaAXP…

    OSがヘッダーに互換性のないアーキテクチャを検出した場合、プログラムの実行を完全に拒否します。その他の場合(たとえば、x86_64でx86プログラムを実行しようとすると)、プログラムを他のモードとは異なるモードで実行する必要があることがわかります。

  • もう1つは、プログラム内の実際のマシンコード命令が異なることです。 (ちなみに、これはアーキテクチャが異なるという点です。)64ビットx86_64アーキテクチャには、32ビットx86よりも多くの命令があり、32ビットx86には16ビットよりも多くの命令があります。 (そして、AlphaやARMやItaniumは非常に異なるため、比較できるものはほとんどありません。)

    (x86 CPUが異なれば、命令セットも異なります。時間の経過とともに、「SSE」、「MMX」、「AES-NI」などの基本的な命令セットに加えて、数十の拡張機能が蓄積されたため、プログラムがコンパイラが最新のCPUに最適化することを許可されている場合、Pentiumなどの古いCPUでは実行されません。)

    また、両方のアーキテクチャで同じ基本命令の場合でも、データサイズが大きくなる可能性があり、最も重要なのは、メモリアドレスが大きくなることです。64ビットアーキテクチャは、64ビットを使用して位置を表すため、通常「64ビット」と呼ばれます。メモリなど。

    そのため、ヘッダーを手動で編集してOSに異なるアーキテクチャを通知したとしても、プログラムが毎回クラッシュするだけで済みます。

  • 一方、x86_64には、x86と同じ命令があります(単純に追加)ので、OSの実行は比較的簡単です。 64ビットモードでの32ビットプログラム。そのプログラムを扱うときは、ほとんどの場合、x86機能のみを使用するように注意します。ただし、他の方向にも同じことは当てはまりません。プログラムのCPUを64ビットモードに切り替えるように32ビットOSが作成されていたとしても、プログラムが何かを実行した可能性があります。 OSが対処できなかったこと。

ソースコードがある場合は、さまざまなアーキテクチャ用に簡単にコンパイルできます(正しく記述されていると仮定します。一部のプログラムには、メモリポインタが常に32ビット幅であるなどの前提があります…)しかし、コンパイルされたバイナリがある場合は、運の。

9
user1686

この場合のビット数は、コンピュータが使用するメモリアドレスのサイズを示します。

32ビットのメモリアドレスシステムは最大2 ^ 32(4294967296)の異なるメモリ位置(正確には4GBのストレージ)を指すことができ、64ビットのメモリアドレスシステムは最大2 ^ 64の場所(〜16兆GB)を指すことができます。

64ビットプログラムを32ビットコピーのWindowsで実行できないのはなぜですか?
32ビットプログラムは、データを32ビットで保存したさまざまな場所に保存します。また、32ビットを64ビットのストレージに格納できるため、Windowsは、64ビットの他の32ビットを適切に埋めながらプログラムを正常に実行します。

一方、64ビットプログラムは64ビットを使用して場所を示します。半分を破棄せずに64ビットを32ビットストレージに格納することはできないため、Windowsは32ビットコンピューターで64ビットプログラムを実行することを拒否します。

プログラムには、64ビットプログラムであることをWindowsに通知するコードが含まれていますか、それともWindowsは単に実行に失敗しますか?
すべてのプログラムにはヘッダーがあり、32ビットアプリケーションか64ビットアプリケーションかなど、プログラムの実行方法について知っておく必要のあるすべてのことをWindowsに通知します。

同じプログラムの2つのバージョンのファイルサイズに大きな違いが見られたので、コードが違うと思います。コードを変更してプログラムを実行することは可能ですか?
64ビットは32ビットの2倍のメモリ量を占有します。そのため、64ビットプログラムは32ビットプログラムよりも大きくなっています。

これらのメモリ位置は、プログラムのごく一部を構成するだけです。その大部分は指示(同じサイズのまま)とテキストやアイコンのようなものです。サイズが2倍になるのはメモリ位置だけなので、64ビットバージョンのプログラムは2倍のサイズよりもわずかに大きくなります。

これがお役に立てば幸いです。

2
tulhan

実際には、32ビットと64ビットの実行可能ファイルには2つの主な違いがあります。サイズと速度。

64ビット、より多くのメモリへのアクセス

32ビットは、プログラムのアドレス空間が2 ^ 32整数値の範囲であることを意味します。つまり、プログラムは2 ^ 32までカウントする方法しか知ることができません。したがって、その範囲内のメモリのみを参照できます。それは約2GBです。

  • 32ビットプログラムは、最大4GBのメモリを表示/使用できます。実際には、その範囲の一部がOS /コード用に予約されているため、それよりも少なくなります。

2 ^ 64ははるかに大きい数値であるため、64ビットプログラムがはるかに広い範囲の値にアクセスできることは明らかです。彼らはより多くのメモリを表示/使用できます。 SIプレフィックスがわからないほど大きい:16エクスビバイト。エクスビバイトとは何ですか?誰も予見可能な将来を本当に気にしないほど十分に大きい。

  • 64ビットプログラムは、(実際には)必要になる可能性のあるすべてのメモリを(この10年間で)参照できます。

32ビット、わずかに少ないメモリ消費、わずかに高速な実行

したがって、すべてのソフトウェアを64ビット用にコンパイルする必要があることは明らかです。 32ビットは64ビットよりも少ないスペースで済むということを除けば、これはほぼ真実です。これには2つの大きな影響があります。

  1. 64ビットプログラムはより多くのスペースを占有します。各メモリ参照(ポインタ)は2倍のサイズを取ります。その違いは通常無視できます。
  2. 64ビットプログラムの実行速度は少し遅くなります。ポインタが大きいため、メモリ内のデータはあまり密集していません。マシンのさまざまなレベルのキャッシュがいっぱいになるデータが少なくなり、キャッシュミスが増えます。 latency であるため、パフォーマンスソフトウェアには、現在、適切なキャッシュ使用率(メモリの局所性)が不可欠です。また、一部の算術演算には、整数のビット幅に比例した時間がかかります。一部のCPU命令は、64ビットと32ビットでは低速です。
1
AntoineG