質問のコンテキストを使用していないため、質問の最初の部分に対する答えは間違っていると思いますThe program and data together fit in the lowest page (0-4095) The stack fits in the highest page
。したがって、ページテーブルエントリの総数は1048576ですが、使用するエントリは2つだけで、2つのページごとに1つずつです(エントリ0はコード/データページで、エントリ1048575はスタックページでポイントします)。
質問の2番目の部分では、非常に役立つヒントが提供されますtwo-level paging, with 10 bits in each part
。しかし、最初に、上記のより単純なケースに戻りましょう...
1ページテーブルのケース1の場合、仮想アドレスは次のとおりです。
- 32ビット(として与えられる
A computer has 32-bit virtual addresses
)
- それらの最下位12ビットは、ページ内の場所を示します(として
A computer has ... 4-K.B pages
も、としても指定されますfit in the lowest page (0-4095)
)
残りの最上位20ビットは、明らかにページテーブルのエントリを選択します。選択したページテーブルエントリには、ページの物理アドレスが含まれています。
したがって、仮想アドレスは次のようになります。
most significant bits least significant bits
| 20 bits = index into the page table | 12 bits = index into the page |
したがって、CPUは次の式を使用してメモリにアクセスします。
PhysicalAddress = PageTable[VirtualAddress / 4096] + VirtualAddress modulo 4096
それでは、ケース2に戻りましょう。
ページ内のバイトを選択するための12LSBビットがまだあります。
しかし、何が新しいのですか?ですtwo-level paging, with 10 bits in each part
。
これらの10ビットは、ページテーブルインデックスの長さであり、現在2つあります。
これにより、仮想アドレスの次の内訳に到達します。
most significant bits least significant bits
| 10 bits = PT index | 10 bits = PT index | 12 bits = page index |
そして、アドレス変換式は、当然、次のとおりです。
PhysAddr = PageTable[VirtAddr / (1024*4096)][(VirtAddr / 4096) modulo 1024] + VirtAddr modulo 4096
今でも、2ページを占める同じプログラムがあります。
コード/データページを指す仮想アドレスは(バイナリで)次のとおりです。
0000000000|0000000000|xxxxxxxxxxxx
また、スタックページを指す仮想アドレスは(バイナリでも)次のとおりです。
1111111111|1111111111|xxxxxxxxxxxx
これから、レベル1で2つの異なるページテーブルエントリ(インデックス0000000000と1111111111で選択)を使用しており、同様にレベル2で2つの異なるページテーブルエントリを使用していることがわかります。
したがって、ケース2の場合、プログラムの動作に必要な合計は2 + 2=4ページテーブルエントリです。
覚えていない場合のPS:2 10 = 1024、2 12 = 4096、2 20 =1048576。