次の画像は、32ビットプロセスの仮想アドレス空間がどのように分割されているかを示しています。
しかし、64ビットプロセスの仮想アドレス空間はどのように分割されますか?
承認された回答:
x86
64ビットのx86仮想メモリマップは、アドレス空間を2つに分割します。下部のセクション(上部のビットが0に設定されている)はユーザー空間であり、上部のセクション(上部のビットが1に設定されている)はカーネル空間です。 (x86-64は、「正規」「下半分」および「上半分」のアドレスを定義し、ビット数は実質的に48または56に制限されていることに注意してください。詳細については、ウィキペディアを参照してください。)
完全なマップはカーネルに詳細に文書化されています。現在は次のようになっています
Start addr | オフセット | 終了アドレス | サイズ | VMエリアの説明 |
---|---|---|---|---|
0000_0000_0000_0000 | 0000_7fff_ffff_ffff | 128 TiB | ユーザースペース仮想メモリ | |
0000_8000_0000_0000 | +128 TiB | ffff_7fff_ffff_ffff | 〜16M TiB | 非正規 |
ffff_8000_0000_0000 | -128 TiB | ffff_ffff_ffff_ffff | 128 TiB | カーネル空間仮想メモリ |
48ビットの仮想アドレスを使用します。 (56ビットバリアントは同じ構造で、16KPiBホールの両側に64PiBの使用可能なアドレス空間があります。)
(16KPiB =16MTiB =2バイトであることに注意してください。)
32ビットの場合とは異なり、「64ビット」のメモリマップはハードウェアの制約を直接反映しています。
ARM
64ビットARMには、ハードウェアでも同様のアドレスの違いがあります。上位16ビットは、ユーザースペースの場合は0、カーネルスペースの場合は1です。 Linuxは、ページテーブルレベルの数とページサイズに応じて、仮想アドレスに39、42、または48ビットを使用します。 ARMv8.2-LVAでは、さらに4ビットが追加され、52ビットの仮想アドレスになります。
これもカーネルに詳細に文書化されています。