2012-09-23 21 views
5

私はBovetとCesatiの "Understanding Linux Kernel"という本を読んでいます。第2章では、「Linuxでのページング」では、PAEを有効にしていない32のアーキテクチャーを使用して、ページの中間と上部のディレクトリーを除去する方法を説明しています。私は作者が何を意味しているのかについて問題があります。Linuxカーネルメモリ管理のページングレベル

彼らは治療で緩んでいて、直感的に理解できません。

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

誰かがこれをもっと美味しく説明できますか?

+0

もう少し考えてみましたが、これが意味をなさないかどうか確認してください。したがって、基本的に、このMMUハードウェアは、TLBミスのページ階層を通り抜けます。このため、基本的に単一のエントリPMDとPUDは気付かれません。しかし、残りのカーネルコードでは、4レベルのページングの統一されたインタフェースを提示する必要があります。したがって、1つのエントリPUDと1つのエントリPMDがあり、それぞれがそのアドレスの対応するPGDエントリとまったく同じ値を含むようにエミュレートされます。 – subramanian

+0

はい。 PAEのないプロセッサでは、MMUは下位の2つのテーブルしか期待していませんが、カーネルは4つすべてを想定しているため、上位2つを1つのエントリで作成する必要があります。できるだけ回答としてコメントを追加してください。 – ughoavgfhw

+0

私の説明には、Linuxiosがそれを私に明確に説明する穴があったと思います。私は彼の答えを正しいものとしてマークします。 – subramanian

答えて

2

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

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

しかし、PAEで、あなたはこの取得:

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

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

と長いモードでは、あなたがこれを取得するだから、通常の32ビットでは、あなたがこれを取得することを意味します

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

+0

ああ!今私は混乱していた場所を見ます。この本は中2のテーブルが非アクティブであるように説明していたようだ。まったく意味をなさないとは思われませんでした。あなたの答えがありがとう! – subramanian

0

現時点で私は同じ本を読んでいるので、新しい質問をしたいとは思わない。 PUDとPMDは「排除」されているが、この二つのテーブルのいずれかが持っている理由、二つのレベルが十分であると言われているテキストで

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

、それは次のとおりです。
テーブルの通常のシーケンスは以下のとおりです。長さは1であり、シーケンスの正しい順序で保持されます。
これは、PML4(PGD)がPD(PMD)に対応し、PTへの直接ポインタで構成されていることを意味します。したがって、PUDとPMDはスキップされます。しかし、私の理解は元の質問の正解には対応していません。
32ビットアプリケーションがシステムコールを行い、64ビットカーネルモードに切り替えると、そのようなアドレスはどのように解決されますか?この場合、MMUは4つのレイヤーを必要とし、2つではありません。
私の理解では何かが間違っていることは明らかです。うまくいけば誰かが物事をクリアすることができます。

関連する問題