6

BovetとCesatiの「UnderstandingLinuxKernel」という本を読んでいます。2番目の章の「Linuxでのページング」の下で、著者は、PAEが有効になっていない32のアーキテクチャでページミドルおよびアッパーディレクトリがどのように排除されるかについて言及しています。著者の意味を理解するのに苦労しています。

彼らは治療が緩く、直感的にはあまり意味がありません。

物理アドレス拡張のない32ビットアーキテクチャの場合、2つのページングレベルで十分です。Linuxは基本的に、ページ上位ディレクトリとページ中ディレクトリのフィールドにゼロビットが含まれていると言ってそれらを削除します。ただし、同じコードが32ビットおよび64ビットアーキテクチャで機能できるように、ポインタのシーケンスでのページ上位ディレクトリとページ中間ディレクトリの位置は保持されます。カーネルは、ページ上位ディレクトリとページ中間ディレクトリのエントリ数を1に設定し、これら2つのエントリをページグローバルディレクトリの適切なエントリにマッピングすることにより、それらの位置を維持します。

誰かがこれをもっと口当たりの良い方法で説明できますか?

4

2 に答える 2

2

つまり、カーネルは常に4レベルのページテーブルを使用し、通常の32ビット、PAE、およびロングモードの両方に対応できるということだと思います。引用でそれらが意味するのは、PM4LとPDTがちょうど次のエントリを指す1つのエントリの長さに設定されているということだと思います。つまり、通常の32ビットでは、次のようになります。

                              /-> Page table
PM4L -> PDT -> Page Directory --> Page table
                              \-> Page table

しかし、PAEでは、次のようになります。

PM4L -> PDT -> 512 Page Directories -> 1024 Page tables

ロングモードでは、次のようになります。

PM4L -> 512 PDTs -> 512 Page Directories -> 1024 Page tables

ただし、常に4つのレベルがあるため、カーネルの残りの部分には、32ビット、PAE、およびロングモードにわたる統一されたインターフェイスがあります。

于 2012-09-24T00:20:43.637 に答える
0

現在、私は同じ本を読んでいますが、これは私の問題を正確に扱っているので、新しい質問をしたくありません。
テーブルの通常のシーケンスは次のとおりです。

PML4 (Linux: PGD) -> PDPT (Linux: PUD) -> PD (Linux: PMD) -> PT

本文では、2つのレベルで十分であると言われているため、PUDとPMDは「削除」されますが、この2つのテーブルはいずれも長さが1であり、正しい順序で保持されます。
私の理解では、これはPML4(PGD)がPD(PMD)に対応し、PTへの直接ポインターで構成されていることを意味します。したがって、PUDとPMDは「スキップ」されます。しかし、私の理解は元の質問の正解に対応していません。
そして、32ビットアプリケーションがsyscallを実行し、64ビットカーネルモードに切り替わる場合、そのようなアドレスはどのように解決されますか?この場合、MMUは2つではなく4つのレイヤーを想定しています。
物事がそのように機能することができないので、私の理解に何かが間違っていることは明らかです。うまくいけば、誰かが物事を片付けることができます。

于 2018-02-24T00:54:44.540 に答える