Linuxでは、64ビットプロセスの仮想アドレス空間はどのように区別されますか?

Linuxでは、64ビットプロセスの仮想アドレス空間はどのように区別されますか?

次の図は、32ビットプロセス仮想アドレス空間がどのように分割されているかを示しています。

ここに画像の説明を入力してください。

では、64ビットプロセスの仮想アドレス空間はどのように区別されますか?

ベストアンサー1

x86

64ビットx86仮想メモリマップは、アドレス空間を2つの部分に分割します。下位部分(0に設定された最も高いビット)はユーザー空間であり、上位部分(1に設定された最も高いビット)はカーネル空間です。 (x86-64は「標準」「下半分」および「上半分」アドレスを定義し、ビット数は実際には48または57に制限されています。ウィキペディアまたはインテル SDM、第3巻、セクション4.5を参照してください。 )

地図全体がよく文書化されています。カーネルから;現在は次のとおりです。

初期アドレス オフセット 最終住所 サイズ 仮想マシン領域の説明
0000_0000_0000_0000 0 0000_7fff_ffff_ffff  128チタンホウ素 ユーザー空間仮想メモリ
0000_8000_0000_0000 +128TiB ffff_7fff_ffff_ffff ~16MTiB 非標準的な
ffff_8000_0000_0000 -128TiB ffff_ffff_ffff_ffff  128チタンホウ素 カーネル空間仮想メモリ

48ビットの仮想アドレスがあります。 57ビットバリアントは、16K PiBホールの両側に64PiBの使用可能なアドレス空間を持つ同じ構造を持っています。

初期アドレス オフセット 最終住所 サイズ 仮想マシン領域の説明
0000_0000_0000_0000 0 00ff_ffff_ffff_ffff  64スキンB ユーザー空間仮想メモリ
0100_0000_0000_0000 +64PiB feff_ffff_ffff_ffff ~16K PiB 非標準的な
ff00_0000_0000_0000 -64PiB ffff_ffff_ffff_ffff  64スキンB カーネル空間仮想メモリ

(16K PiB = 16M TiB = 2 64  バイトです。使用可能なアドレス空間のほとんどは非標準です。)

どちらのレイアウトも、52本のアドレスライン(4 PiB)を使用して同じ物理アドレス空間へのアクセスを提供します。レベル 4 ページングは​​、特定の時間に 256TiB のサブセットにのみアクセスを提供します。レベル 5 ページングは​​、物理アドレス空間全体へのアクセスを提供します。現在、x86 CPUの処理能力は、私が知っている限り、これよりはるかに低いです。単一のCPUは最大6TiBを処理できます。

32ビットの場合とは異なり、「64ビット」メモリマップはハードウェア制限を直接反映します。

64ビットARMは、ハードウェアで同様のアドレス区切りを持ちます。最初の12ビットまたは16ビットはユーザースペースの場合は0、カーネルスペースの場合は1です。 Linuxは、ページテーブルレベルの数とページサイズに応じて、仮想アドレスに39、42、または48ビットを使用します。 ARMv8.2-LVAの場合、別の4ビットが追加され、52ビット仮想アドレスが生成されます。

これもよく文書化されていますカーネルから

おすすめ記事