図5.5に2wayセットアソシアティブ方式のTLBの構造を示す。仮想アドレス(Virtual Address)の中位の部分をインデックスとしてTLBをアクセスし、上位仮想アドレス(VA H)の一致を検査し、一致したWayの物理アドレスと属性を使用する。また、どちらのwayもヒットしなかった場合(TLBミス)は、メモリ上のページテーブルを読んで物理アドレスと属性を得る。そして、その内容をTLBに登録する。

TLBミスが発生した場合、ハードウェアがメモリ上のページテーブルを読んでTLBを入れ替えるプロセサもあるが、後述の2段階のページテーブルのようにアドレス変換構造が複雑になるにつれて、OSに割り込みを上げて、ソフトウェア的にページテーブルを読み、TLBの内容を入れ替えるという方式のプロセサが多くなって来ている。

図5.5 2wayセットアソシアティブ方式のTLB

ページテーブルはプログラム(UNIX、Linuxのprocess)単位に必要であり、実行するプログラムをスイッチすると、ページテーブルが切り替わり、同じ仮想アドレスでも異なる物理アドレスに対応することになる。したがって、図5.5の構造のTLBでは、ページテーブルの切り替えに伴い、TLBのすべてのエントリを無効化する必要が出る。TLBのサイズが小さい場合は、これは大した問題ではないが、大きなTLBの場合にはロスが大きい。

このロスを避けるため、プロセスごとの仮想空間を識別するアドレス空間ID(ASID)という考え方を導入したTLB構造を図5.6に示す。各プロセスは自分のページテーブルの先頭アドレスとアドレス空間IDを持つ。例えば、SPARC V9アーキテクチャでは、アドレス空間IDは13ビットであり、8K個のプロセスを識別することができる。

そして、TLBでは、上位仮想アドレス(VA H)の一致に加えてアドレス空間IDの一致をチェックすることにより、複数のプロセス空間の仮想-物理対応エントリがTLBに混在しても区別が出来るようになり、プログラムの切り替えごとにTLBをフラッシュする必要はなくなる。

図5.6 アドレス空間IDを使うTLB構造

32ビットアドレスの場合は、これまで説明してきた1段階のページテーブルで良いが、最近の64ビットアドレスの場合は仮想空間は16Exaバイトとなり、8KBページの場合はエントリ数が多過ぎてページテーブルのサイズが2PBと巨大になり、実用的でない。

しかし、現状ではExaバイトのメモリを実装するコンピュータは存在せず、全仮想アドレス空間をカバーするページテーブルは必要ない。この性質を利用して、図5.7のように複数の小さな部分ページテーブルを作り、それらのページテーブルのエントリアドレスを、上位仮想アドレスで選択する2段階方式が用いられる。

図5.7 64ビットアドレス空間用の2段階方式のページテーブル構造

この2段階方式のページテーブルの場合は、OSは、Index Hからそれぞれの部分ページテーブルの先頭アドレスを得て、さらにIndex Lを使って物理アドレスを得るという2段階の索引を行う必要があるが、ハードウェアとしては、図5.6と同じ構造でVA HとIndex Hをタグとする TLBを用いてアドレス変換を行うことができる。

命令やデータキャッシュでは1次キャッシュ、2次キャッシュという階層構造が用いられるが、ページ変換テーブルのキャッシュであるTLBの場合も、最近のプロセサでは2階層の構造が用いられる。この場合、1次キャッシュに相当する上位のキャッシュはマイクロTLBと呼ぶ。マイクロTLBはエントリ数が16~32程度と少ないので、フルアソシアティブ方式が用いられる。

そして、2次キャッシュに相当するページテーブルキャッシュはメインTLBと呼ばれる。メインTLBは128~1024程度のエントリを持ち、エントリ数が多いので、一般にセットアソシアティブ方式のキャッシュで実現されている。