指定:64ビット仮想バイトアドレス、16 KBページ、32ビット物理バイトアドレス。
有効、保護、ダーティ、使用の各ビットが合計4ビットで、すべての仮想ページが使用中であると仮定した場合の、このマシンのページテーブルの合計サイズはどれくらいですか。
これまでのところ、ページテーブルエントリの総数:2 ^ 64/2 ^ 14 = 2 ^ 50はわかっていますが、各エントリのサイズを見つける方法を理解できません。
質問で述べたように、各エントリには4ビットが含まれていますが、エントリの残りのサイズは、物理バイトアドレスから見つけることができますか?私はこの部分で混乱しています。
ありがとう。
以下のページテーブルサイズを計算する1つの方法を参照してください。
まず、log2(バイト単位のページサイズ)を計算して、ページオフセットを取得します。あなたの例では、ページサイズは16 Kバイトなので、log2(16 * 2 ^ 10)は14です。つまり、ページオフセットは14ビットです。
次に、物理アドレスに割り当てられたビットの総数からページオフセットを差し引いて、物理ページ番号(PPN)のサイズを計算します。この例では、物理アドレスは32ビットなので、PPN = 32-14、または18ビットです。
これで、計算されたPPNに有効なビット、保護ビットなどを追加して、ページテーブルエントリ(PTE)のサイズを計算できます。この値は、ページエントリごとに必要なビットの総数になります。この例では、PTEは22ビットです。
最後に必要な情報は、ページテーブルのページエントリの数です。これは、仮想ページ番号のビットの総数からページオフセットを差し引くことで得られます。つまり、64-14 = 50です。つまり、仮想アドレスの全範囲を表すには、2 ^ 50のエントリが必要です。
したがって、ページテーブルの合計サイズは2 ^ 50 * 22ビットになり、2.75PBになります。これはメモリに保持する量が多く、おそらく高価で低速になるため、最近のプロセッサは最近使用されたページエントリのキャッシュとして Translation Lookaside Buffer(TLB) を使用します。
お役に立てれば!
16 KBのページサイズ= 2 ^ 14であるため、ページオフセットには14ビットが必要です。 64ビットの仮想アドレスのうち、このオフセットを削除すると、50ビットのままになります。これは、ページテーブルに2 ^ 50のエントリがあることを意味します。
さらに、物理アドレスは32ビットであり、オフセットはこの32ビットのうち14ビットを構成するため、ページテーブルから取得する必要がある18ビットが残ります。
これらの18ビットのうち、4ビットが有効、使用などです。
とにかく、エントリごとに、使用されるビット= 18
ページテーブルの合計メモリ(これはプロセスごとなので、指定されている場合は、プロセス数を掛ける必要があります)= 2 ^ 50 * 18ビット
CSAPPで明確な定義が見つからず、勉強しているときに混乱したので、不思議に思う人のために少し明確にする必要があります。 物理ページ番号(PPN)は、このPAがどのページにあるかを示します。PPN= 0の場合、このPAは0番目のページテーブルにあり、PPN = 11の場合、PAは3番目のテーブルにあります。 。 1つのトリックは、オフセットのビット数がそのlocationのサイズを決定することです。 ページオフセットが14ビットの場合、ページのサイズはその場所の2 ^ 14単位です(ここではPTEあたり)。私が間違っていたら訂正してください。