1

タイトルはそれをかなり要約しています。/largeaddressawareフラグが設定された x86 プラットフォーム用にコンパイルされたアプリケーションがあります。/3GBx64 システムで実行すると、ブート オプションを指定しなくても、拡張された 4 GB のユーザー モード仮想メモリを「無料で」取得できます。x86 システムでは、これはカーネル モード メモリが 1GB しかないことを意味しますが、x64 システムはより多くのメモリをアドレス指定できるため、カーネル モードは 2GB を維持するか、それとも 3GB まで増加するのでしょうか?

編集:明確にするために、プロセスごとの制限について疑問に思っています。質問は、この記事を読んだことに由来します。

編集 2: この質問は、64 ビット オペレーティング システムで 32 ビット プロセスがアクセスできるメモリ量はどれくらいですか? その質問は、システムがアクセスできるメモリではなく、アプリケーションがアクセスできるメモリのみを扱っているためです。私が誤解していて、プロセスごとにシステム用に予約されているメモリがない場合は、誰かがそれを回答として書いていただければ幸いです。これについて混乱したのは私が初めてではないと確信しています。

4

2 に答える 2

4

あなたを混乱させるいくつかの誤解があります。

まず、32 ビット Windows について見てみましょう。各プロセスの仮想アドレス空間には、プロセス自体に割り当てられた特定の部分と、カーネルが必要とするもののための特定の部分があります。ただし、すべてのプロセスは同じカーネル メモリを共有します。独自の仮想アドレス空間にカーネル メモリがあるという事実は、基本的に、アプリケーションでカーネル オブジェクトとデータを処理するときにアドレス空間を切り替える必要がないようにするためのパフォーマンスの最適化です。

デフォルトでは、これは 1:1 の分割であるため、2 GiB のユーザー アドレス空間と 2 GiB のカーネル アドレス空間が得られます。これは、初期の 32 ビット Windows ソフトウェアで (ab) 使用されていました (お使いのコンピューターが 486 CPU などで合計 4 MiB のメモリしか持っていなかった場合)。スペースにはにポインターがありませんでした2 GiB バリア - 事実上、独自のデータ用に解放された任意のポインターの最高ビットを提供します。多くの場合、これは「適合する場合、これは値であり、そうでない場合は構造体へのポインタである」というハイブリッドなアプローチを可能にするために使用され、メモリと少しの間接性を節約しました。これは非常に広く普及しているため、互換性の問題を防ぐために、デフォルトは初期の頃と同じ分割になっています。ただし、別の分割 (3 GiB のユーザー空間と 1 GiB のカーネル空間) にオプトインする方法もあります。これが/3GBオプションの機能です。しかし、それだけでは十分ではありません。アプリケーションを使用してオプトインする必要があります/LARGEADDRESSAWARE。これは基本的に「私はポインターで奇妙なことをしない」と言っています。

32 ビット OS またはプロセスは、必ずしも 4 GiB のメモリしかアドレス指定できないことを意味するわけではないことに注意してください。CPU がいつでも直接アクセスできるものを制限するだけです。メモリを集中的に使用するサーバー ソフトウェアの場合、「32 ビット」バージョンでも、より多くのメモリのアドレス指定をサポートしている場合があります。たとえば、32 ビットの MS SQL Server は、AWE を通じて最大 64 GiB をサポートしています。これは基本的に、仮想アドレスの物理アドレスの再マッピングを可能にする仮想化の別のレイヤーです。理論的には、AWE の有無にかかわらず、アドレス指定できるメモリの量に制限はありません。結局のところ、メモリ マップ ファイルとして機能する独自のハードウェアを使用することを妨げるものは何もないため、効果的に無制限のアドレス空間が得られます。もちろん、セグメント化されたメモリの時代のように、それを扱うのは簡単でも実用的でもありません:)

64 ビット Windows では、 は/3GB意味をなさず、無視されます。デフォルトのアドレス空間分割は Windows の正確なバージョンによって異なりますが、「テラバイト以上」の範囲にあり、32 ビットの制限をはるかに超えています。最新の Windows の場合、これは通常 128 TiB ユーザー + 128 TiB カーネルです。32 ビット アプリケーションは/LARGEADDRESSAWARE、以前と同様に使用する必要があります。ただし、カーネルは現在 64 ビットであるため、ユーザー プロセスと同じアドレス空間に存在することはできません。そのため、64 ビット OS 上の 32 ビット アプリケーションは 4 GiB のアドレス空間にフル アクセスできます。

もちろん、これらの制限は、64 ビットが理論的にアドレス指定できる範囲をはるかに下回っています。ただし、ほとんどの 64 ビット CPU は実際にはできません。64 ビットのアドレス空間全体をアドレス指定します。最後に確認したときに最も一般的なのは 48 ビットだけでした。そして驚き、驚き - これにより、Windows の制限である 256 TiB のアドレス空間が得られます。結局のところ、マイクロソフトの陰謀ではありません! :) 実際、これは新しいことではありません。Intel x86 の 32 ビット ALU が 32 ビット アドレス空間に関連付けられているという事実は、CPU の歴史の中でかなり異常です。CPU は、ALU 幅よりも高いまたは低いアドレス空間 (仮想アドレス指定または物理アドレス指定のいずれか) の幅を持つことがよくあります。 . アドレス可能なメモリの 1 MiB という MS DOS の典型的な制限 (ユーザー アプリケーションに 640 kiB が残っている) も、これに由来します。当時の「32 ビット」CPU は 20 ビット アドレスしか使用できませんでした。

于 2016-03-31T22:12:36.930 に答える