ページ付けに目次が必要な理由は本当に理解できません。

ページ付けに目次が必要な理由は本当に理解できません。

私は長年これを理解しようとしてきましたが、毎回理解していませんでした。私は、ページング、ページテーブル、ページテーブルディレクトリがLinuxでどのように機能するのかをよく知っていますが、実際になぜ必要なのかわかりません。

ページングとページテーブルレベル(Linuxでは4つのレベルを使用)が必要な理由は、すべてのメモリを同時にロードできないためです。しかし、すべてのディレクトリをロードせずに選択したページ数とアドレスだけをロードすることはできませんか?

特定のフレームが物理メモリのどこにあるかを知る必要がありますが、なぜ巨大なページテーブルのサブセットを取得できないのでしょうか。それがどんな問題を引き起こすか。ページ+オフセットを使用しないと、すべてが大きくなりすぎることがわかりますが、ディレクトリは実際に問題を解決しますか?

さまざまなシステムがページテーブルレベルを構築するためにアドレスのビットを分割する方法について多くの議論がありますが、最終的には常にエントリに対して32/64ビットで終わります。私たちはもっと問題を解決することはできません(cr3PAEなどのレジスタのトリックを除く)。それでは、問題を分割するのはなぜですか?最後に(簡単に説明します)単に「アドレス3572」と言うよりも、「ディレクトリ3、サブディレクトリ5、ページ7、オフセット2」の方が良いですか?

さらに悪いことに、CPUが私たちに役立たない場合(私の考えには1クロック周期にすべてを行うことができる回路が組み込まれているようですが?確かではありません!)、すべてを検索しなければ効率がはるかに低くなるのではないでしょうか。 ?論理/物理メモリマップを直接取得し、必要なアドレスにアクセスする代わりに、すべてのメモリアクセス時にディレクトリとサブディレクトリを管理しますか?

ベストアンサー1

複数のレベルを持つ理由は、スペースを節約するためです。

複数のレベルが利用できない場合は、何が必要かを検討してください。 48ビットのアドレス空間があり(現在x86_64 CPUは64ビット全体を提供していません)、4kバイトのページサイズ(12ビット)を使用している場合は、2の36平方ページを持ちます。

マッピング情報を64ビット(8バイト)に収めることができる場合、変換テーブルを保持するには8 * 2** 36バイトまたは512 GBのメモリが必要です。

テーブルのほとんどすべてのエントリは、「不正なアドレス」を示す値に設定されます。

複数のレベルで変換テーブルのスペース要件を減らすことができます。 64 ビットのアドレス空間が current_unused/PML4/PDPT/PD/PT/address_in_page の 16/9/9/9/9/12 ビットに分割されている場合、PML4 テーブルには 512 個のエントリしか必要なく、そのうち 510 個は値になります。 「無効なアドレス」を示し、残りの2はPDPTの512項目の2つの配列を指します。ここで停止すると、必要なスペースが2 ** 36項目から約2 + 2** 27項目に減少し、これは元の線形要件の0.2%未満です。もちろん、そこで終わらずに3つの追加レベルがありますが、それほど大きなコスト削減効果を提供しません。

おすすめ記事