保護モードに入ると、CR3 レジスタは「ページ ディレクトリ」(保護モードに入る前に好きな場所に置くことができます) を指します。これはメモリのページです (「小さな」ページは 4 KiB であり、 「ラージ」ページは 4 MiB) で、「ページ テーブル」を指す 1024 ページ ディレクトリ エントリ (PDE) があります。各エントリは、ポインターの上位 10 ビット (ページ テーブルのアドレス) と、ポインターの下位部分 (present、permission、dirty など) を構成する一連のフラグです。
(1024 は、ページが 4096 バイトでポインターが 4 バイトであるという事実から来ています。)
各「ページ テーブル」はそれ自体が 1024 個の「ページ テーブル エントリ」(PTE) であり、ここでもメモリ内の物理ページを指す 1024 個のエントリと、多数の (ほぼ同じ) フラグが含まれています。
したがって、32 ビットの仮想アドレスを変換するには、ポインターの上位 10 ビットをインデックスとして CR3 のテーブルに取ります ( 10 個のエントリが 2 つあるため)、および -- その PDE がさらに細分化されている場合 (つまり、 「大きな」ページではなく、フラグから判断できます) -- PDE の上位 20 ビットを取得し、そのアドレスでページ テーブルを検索し、仮想アドレスの次の-topmost 10でインデックスを作成します。ビット。次に、最上位の 20 ビットが物理ページを参照し、最下位の 12 ビットが物理ページが実際に存在することを示していると仮定します。
Physical Address Extension (PAE) を使用している場合は、階層の最上部に別のレベルが表示されます。
注: 自分自身 (およびおそらく CPU) の正気を保つために、ページ ディレクトリとページ テーブルを自分自身にマップすることをお勧めします。そうしないと、混乱が早くなります。:)
TLB はハードウェアで管理されているため、ページ テーブルのキャッシュは透過的ですが、TLB 内の PTE を無効にする命令 InvlPG があります。(いつ使用すべきか、いつ使用すべきでないか正確にはわかりません。)
ソース: http://wiki.osdev.org/Paging