32ビットWindowsシステムでプロセスが4GBのメモリをアドレス指定できず、2GBしかアドレス指定できない理由を誰かが知っていますか?
それはWindowsシステムの制限だけですか?
注:アドレス指定可能な合計メモリではなく、単一のプロセスでアドレス指定できるメモリを指します。
32ビットWindowsシステムでプロセスが4GBのメモリをアドレス指定できず、2GBしかアドレス指定できない理由を誰かが知っていますか?
それはWindowsシステムの制限だけですか?
注:アドレス指定可能な合計メモリではなく、単一のプロセスでアドレス指定できるメモリを指します。
32ビットWindowsシステムでプロセスが4GBのメモリをアドレス指定できない理由
しかし、彼らは間違いなくそうすることができます。コードには、通常、アドレス空間の上部をアドレス指定するために必要なアクセス権がありません。ユーザーモードコードはリング3で実行され、上部に到達するにはリング0のアクセス権が必要です。カーネルモード。
さて、それはちょっとした冗談でした。リング0にアクセスできるオペレーティングシステムのカーネルとドライバーは、通常、プロセスの一部であるとは考えられていません。論理的にはそうですが、すべてのプロセスで同じアドレスにマップされます。プロセスがリング3からリング0モードに切り替わるため、技術的にはページを動的にマップすることは可能でしたが、それではカーネルモードの移行が高額で面倒になります。
直感的に:ReadFile()で埋められたファイルバッファは、オペレーティングシステムのコードまたはデータのチャンクと重複するアドレスを持つ可能性があります。最悪の場合、ファイルシステムドライバコードと重複する可能性があります。または、より可能性が高いのは、ファイルシステムキャッシュです。必要なページめくりと二重コピーは、読み取りを予想外に遅くします。最も単純なアーキテクチャの選択、およびギガバイトのRAMを購入できるほど豊富な人がいない1992年に行われた選択は、アドレス空間を2つに単純に削減することで、重複は不可能でした。
それ以外の場合は解決された問題です。32ビットバージョンのWindowsはまれになり、32ビットプロセスは64ビットバージョンのWindowsで4ギガバイトをアドレス指定できます。リンカとeditbin.exeで使用可能な/LARGEADDRESSAWAREオプションによって設定されたEXEヘッダーのオプションビットが必要です。
単純な答えは、仮想アドレススペースの一部は、OSが自身のメモリスペース、VMページテーブル、ハードウェアデバイスなどにマップするために予約されているということです。
理論的にはもっと利用可能にすることができますが(実際、一部のソフトウェア/ドライバーなどに問題がある場合に備えてデフォルトでは有効になっていませんが、Windowsに最大3GBを許可するように指示できます)、システムを効率的に実行するOSの機能を損なうことなくフル4GB。
Windowsでユーザーランドスペースを3GBに拡張した場合でも、アプリケーションはデフォルトで追加の範囲を取得しません。Windowsでは、アプリケーションにフラグを設定する必要があります(MSVCで/ LARGEADDRESSAWAREを使用してビルドし、他のビルド環境については知りません)。または、ソフトウェアがアドレスを想定することによって発生する問題を回避するために、アプリケーションは2GBに制限されます。
32ビットWindowsシステムは、4GBの仮想メモリ範囲をユーザーとシステムの間で均等に分割し、それぞれに2GBの(仮想)使用可能スペースしか持たないようにします。
参照: http: //msdn.microsoft.com/en-us/library/windows/desktop/aa366912%28v=vs.85%29.aspx