あなたを混乱させるいくつかの誤解があります。
まず、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 ビット アドレスしか使用できませんでした。