SH7780は仮想アドレスから物理アドレスへの変換にTLB(Translation Look-aside Buffer)を用いる。TLBには仮想アドレスと物理アドレスの組が表になっている。MMU(Memory Management Unit)はこの表を使って、仮想アドレスから物理アドレスに変換する。このTLBの内容はソフトウェアで管理する。なにしろ、32ビットのアドレス空間では何百万という仮想アドレスがあるのに対して、SH7780のTLBは64(+4)エントリしかないのである。場面に応じてTLBの内容を書き換えてやらなければならない。この書き換えの仕方でシステムの性能は大きく変わる。

TLBはキャッシュの一種であり、TLBエントリの入れ替えにはキャッシュアルゴリズムをそのまま適用できる。代表的なキャッシュアルゴリズムには、ラウンドロビン、ランダム、LRU(Least Recently Used)がある。

ラウンドロビンは、先頭から順番に入れ替えていくアルゴリズムである。最後のエントリまで言ったらまた先頭に戻る。実装は簡単。エントリを指し示すカウンタを一つ用意しておき、入れ替え毎に一つ足していけばよい。最大値になったらゼロに戻す。

ランダムは、ランダムにエントリを入れ替えるアルゴリズムである。SH7780ではTLBを管理するレジスタの一つにランダムなカウンタがあり、これを使えば簡単に実装できる。

LRUは、最近利用されていないエントリを入れ替えるアルゴリズムである。定期的に各エントリへのアクセスを調べて入れ替えの順位を予め決定しておく。

実装してみると、LRUは面倒くさいことがわかる。まずは、入れ替えの順位を記録する表が必要になる。これはとりあえず配列で作っておけばよいが、あまりにエントリ数が多い場合にはリストにした方がいいだろう。入れ替えの時にはこの表を参照して入れ替えのエントリを決定する。

入れ替えの順位はエントリへのアクセス時刻で決まる。この結果、最も最近利用されていないエントリが入れ替えられ、TLBを効率よく使うことができる。TLBエントリのアクセス時刻を知るために、ソフトウェアの手法としては、ダーティビットが使われる。ダーティビットはTLBエントリの中の一つのフィールドで、プロセッサがTLBエントリにアクセスするとダーティビットがセットされる。定期的にダーティビットをクリアすることでどのエントリが最近アクセスされたかがわかる。SH7780はダーティビットの設定を勝手にやってくれない。これもソフトウェアがやらなければならない。これはつまり、ダーティビットがセットされていないエントリにアクセスすると例外ハンドラが起動されてそこからソフトウェアに処理が移るということである。SH7780では根本的な問題として、書き込みアクセスでしか例外が発生しない。したがって、読み込みアクセスは記録できない。

ダーティビットのセットの仕方には二つの方法が考えられる。一つ目の方法はTLBを直接変更する方法である。SH7780のTLBは物理アドレス空間にマップされているので、その領域を書き換えることでダーティビットを設定できる。しかし、この操作をするためにはCPUのモードを切り替える(P2領域でプログラムを実行する)必要がある。この方法が頻繁に使われる場合にはモードの切り替えが性能上の問題となる可能性が高い。

もう一つの方法は通常のTLBエントリの入れ替えと同じくレジスタを使う方法である。この方法だとCPUのモードを切り替える必要がない。

Post a Comment

*
*