ページングについてわからなかった所とその現時点での理解
ページングテーブルについて理解が曖昧だった所の理解が進んだのでその記録*1
曖昧だった点
- なぜ、ページングテーブルを多段に分けるのか?
- 多段に分けても、同じアドレス幅で扱えるページ量は変わらないのでは?
現時点での理解
- 多段に分けるのは、ページングテーブル自体に仮想記憶を適用するため
- ページングテーブルを多段に分けることで
- 扱えるページ量を増やすためではない
そもそもページングとは
メモリを区分けして何らかの属性を付与することで、プロセスごとでメモリ空間を扱いやすくしたり、仮想記憶を実現している。
しかし、扱えるメモリの最小単位である1バイト単位で属性を設定し、管理することは難しいので、一定の大きさに分けて管理している。
その区分け方法として、任意の大きさに分けるセグメント方式、一定の大きさに分けて必要な分だけ切り貼りするのがページング方式。
ページング方式ではプロセスのアクセスの局所性を考慮することで、必要な分だけメモリにロードする仮想記憶の仕組みを導入することができ、メモリを効率よく利用できる。この方法はデマンドページングと呼ばれる。
ページと実際の物理メモリの対応関係を記したものをページテーブルと呼ばれる。
ページテーブルにアクセする際は、CPU内のCR3(コントロールレジスタ3)の内容を取りだす。そこにはページテーブルが格納されている場所を表す、ページディレクトリテーブルが格納されている。
ここでアクセスされるページテーブルが通常のメモリと同様にページとして扱われ、仮想記憶を用いて効率よく利用される。
PTE : Page Table Entryページングに用いられる、データ構造。ページの場所を表す値や、書き込み、読み込みの履歴を管理するための値も格納されている
TLB : Translation Lookaside Buffer メモリアクセスの度にPTEを読み込んでいると遅くなるので、CPUに搭載されているPTE専用のキャッシュがありそれをTLBという。PTEが読み込まれた際に同時にTLBにコピーを置いておく。