-2

編集:命題が不可能であることがわかりました(すぐに指摘してくれたBen Voigtに感謝します)。後世のために、AMDの拡張機能に関する私の以前の誤解を除いて、基本的な質問を次に示します。

(特に Windows) ソフトウェアの 32 ビット ビルドが 64 ビット プロセッサの存在を検出し、64 ビット オペランドと、存在する場合はより大きなレジスタ ファイルを使用するのが一般的かどうか疑問に思っていました。これは、そのような CPU が物理的に存在する場合に i386 上の 16 ビット プロセスが 32 ビット命令を利用することが可能であったのとほぼ同じ方法で、32 ビット プロセスが 64 ビット命令を利用することが実際に可能であると想定していました。エンコーディング オーバーライド プレフィックスを介して。ただし、以下の回答で指摘されているように、これは不可能です。

なぜ 64 ビットの命令を使用し、32 ビットのアドレッシングを使用するのでしょうか?

さて、作業しているデータセットがそのアドレス空間に収まるほど小さいことがわかっているとしましょう。たとえば、プログラムの 64 ビット バージョンを使用しており、それを使用している目的に対して、パフォーマンス モニタリングは、プロセスが 2GB 以下を使用していることを示します。(実際には、これによる、IMAGE_FILE_LARGE_ADDRESS_AWARE フラグが設定された 32 ビット プロセスは、64 ビット Windows で 4GB のユーザー空間を取得します。)

それは問題ではないと考える人もいますが、実際にはそうかもしれません。64 ビット ビルドでは、私の間違いでなければ、プログラムが格納するすべてのポインターが、必要な物理 RAM の 2 倍を消費します。 プログラムが多くのポインターを使用する場合 (たとえば、リンクされたリストやハッシュ テーブルが原因で)、これが加算されてキャッシュ効率が低下する可能性があります。

残念ながら、以下の Ben Voigt の回答で指摘されているように、Windows ではまったく不可能ですが、この目的専用のモードが Linux で行われています。

4

2 に答える 2

3

実際、厳密に言えば、プログラムが 32 ビット イメージであるか 64 ビット イメージであるかは、そのアドレッシング モードを決定するだけであり、データ ワード サイズを含む (特定のサイズを期待する API/ライブラリ呼び出しを除く) 使用する CPU 機能は決定しません。

いいえ、これは正しくありません。Windows では、32 ビットと 64 ビットは、サポートされている 2 つの Intel アーキテクチャと命令セットと同義です。(はい、サポートされているアーキテクチャは他にもあります -- Alpha、Itanium、ARM -- しかし、これらは常に明示的に述べられています。)

あなたが説明するようなバイナリは、「x86_64アーキテクチャ、小さなメモリモデル」(一般x32に略して呼ばれる)になります。ここで、小さなメモリモデルは、ポインタがシステムのワードサイズよりも小さく、データとコードが同じアドレス空間を共有することを意味します。 人々はこのような Linux システムを作ってきました

「32 ビット」の x86 コードとは完全に互換性がありません。x86 命令には、追加レジスタのエンコーディングさえありません。x86_64 命令をサポートするには、CPU のモード ビットを別の方法で設定する必要があります。これは、16 ビット メモリ モデルの時代に存在していた「ベース アドレッシング」と相対ポインタの概念に非常に似ています。

x32 コードは x86_64 命令を使用し、ポインターを使用してアクセスして計算を実行するために 32 ビット データを処理するための命令を使用します。これは、仮想アドレスを範囲 (-2GB:+2GB) に制限する仮想メモリ ロジックによって可能になり、32 ビット変数を 64 ビット レジスタにロードする際の通常の符号拡張により、有効な 64 ビット ポインターが作成されます。

追加のレジスタにアクセスする命令をサポートするために CPU が「ロング モード」にある場合、x86 命令を正しくデコードできません。たとえば、0100 0000 は x86 では ADD 命令ですが、x86_64 では MOV です。

要約すると、アロケータの助けを借りて、64 ビット コードで 32 ビット ポインタを使用することが可能です。追加レジスタを 32 ビット コードに混在させることはできません。

于 2013-04-05T20:47:08.593 に答える
2

x64 機能を使用するには、64 ビット モードで実行する必要があります。32 ビット プロセスから 64 ビット レジスタを使用することはできません。32 ビット プロセスは、32 ビット x86 オペコードに制限されています。32 ビット プロセスの x64 機能は使用できません。

于 2013-04-05T20:54:09.727 に答える