Linuxカーネルは64ビットシステムでmem_map配列をどのように初期化しますか?

Linuxカーネルは64ビットシステムでmem_map配列をどのように初期化しますか?

私はLinuxカーネルがC構造に依存して各物理ページフレームの状態を追跡することを知っていますstruct page。すべてのページフレームの構造はmem_map[]フォーマットされた配列を形成するため、struct pageページフレーム番号をインデックスとして使用して特定のページフレームの構造を簡単に取得できます。 4GiBの物理メモリを備えたx86 32ビットシステムでは、配列は2から20
項目で構成され、ページサイズは4096バイトであるため、各項目のサイズは32バイトであるため、配列全体は32MiBを消費します。これで、物理メモリが4TiBのx86 64ビットシステムに転送されると、配列はそれぞれ32バイトのサイズの2つの30項目で構成されるため、配列は32GiBを消費します。もちろん、物理メモリが増加するにつれて、プラットフォーム固有の4PiB(amd64アーキテクチャの場合は252バイト)に達すると、アレイを最大32TiBまで増やすことができます。カーネルは実際にブート時に大量のデータを初期化する必要がありますか、それとも何か抜けましたか?

ベストアンサー1

3つあります。物理メモリモデルLinuxカーネルは、説明するフラットモデル、不連続メモリモデル、および希少メモリモデルを使用します。

すべてではありませんが、ほとんどのLinuxでサポートされている64ビットアーキテクチャはデフォルトで後者を使用します。これは、メモリ部分とほとんどのアーキテクチャに仮想的に割り当てられたメモリマッピングに依存します。実際の物理メモリを表すのに必要な項目は、必要に応じて割り当てられ初期化されます。大規模システムでは、開始が遅れないようにこの初期化を延期することも可能です。

おすすめ記事