今日も喉が痛い。多少熱っぽいし。困った。
SH4A続き。キャッシュシステムについておさらいしておこう。
SH4A続き。キャッシュシステムについておさらいしておこう。
SH4Aのキャッシュは仮想インデックス物理タグキャッシュだ。キャッシュのイ
ンデックスは仮想アドレスから生成し、キャッシュのタグにはMMUで変換された
物理アドレスを使用する。
仮想アドレス
[31:10]の22bitはMMUで物理アドレスに変換されてキャッシュのタグになる。
+----------------------------+
|31..................13|12.10|9.....5|4.2|10|
+-------------+
[12:5]の8bitがキャッシュのインデックスになる。
+------+
[4:0]はラインサイズの中の場所。
[31:10]がMMUの変換になるのは最少の1Kページに合わせてある。1Kページの場
合、インデックスの[12:10]はアドレスマッピングによるけれど、[9:0]は物理
アドレスに一致するので、物理タグの[31:10]とインデックスの[9:0]でキャッ
シュシステムがアクセスすべき物理アドレスが確定する。
MMUを4Kページとした場合、MMUの変換になるのは[31:12]
VPN
+-------------------------+
|31..................13|12|11|10|9.....5|4.2|10|
+-------------+
INDEX
キャッシュインデックスの12bit目が変換対象となるので、共有メモリの場合、
二つ以上あるアドレスマップの設定によっては、同じ物理アドレスが二つの異
なるキャッシュインデックスに乗ってしまう可能性もある。(シノニム)
命令キャッシュ、あるいはリードオンリーのデータキャッシュであれば、キャッ
シュエントリが消費されるだけなので問題ない。
しかし書き込むことがあると一貫性に矛盾が生じる。解決方としてはマニュア
ルでは、同じ物理メモリを参照するアドレスマップは12bit目を同じにしろとあ
るけれど、これは結構難しい要求だ。
それができない場合は、
+ 共有されるとわかったところで、そのページをアンキャッシュドにする。
あるいは
+ コンテキストスイッチ(アドレスマップの切り替え)の時には常にキャッシュ
フラッシュする。
共有メモリがなければアドレスマップの切り替えでキャッシュフラッシュの必
要はない。それはキャッシュのタグが物理アドレスだから。
キャッシュのアクセスにはキャッシュ命令として
OCBI @Rn d-cache invalidate
OCBP @Rn d-cache write-back invalidate
OCBWB @Rn d-cache write-back
MOVCA.L R0,@Rn d-cacheにメモリからのロードなしに書き込み。
ICBI @Rn i-cache invalidate
SYNCO 完了待ち
とある。SYNCOを除き、これらのキャッシュ命令は、キャッシュシステムを使っ
てタグを生成するので、物理アドレスを特定するのにMMUを使う。なのでTLB例
外を生じる可能性がある。つまりMMUは該当するアドレスマップを提供すること
が前提だ。
他にメモリマップドのアドレスアレイ、データアレイによるアクセスもでき
る。(これは今後のSuperHシリーズではサポートされない可能性があるという
こと) これは、直接インデックスを指定してキャッシュを操作する。いわゆる
インデックス操作。MIPSでは、この操作もCACHE命令からできる(これは東芝だ
けだったかも?)
何が違うかというと、インデックスを直接指定することでTLBミスが絶対に起き
ないことだ。
TLBミスによるアドレスマップによらないので、いかなるアドレスマップによる
仮想アドレスに対しても操作ができる。
しかしインデックスの指定だけだと、実際にキャッシュにあるかどうかに関わ
らず、可能性のあるインデックスの全てのウェイを操作することになってしま
う。これはちょっと皆殺しだ。
その折衷案として、連想ありのアクセス方法もある。この場合指定したアドレ
スからTLBを経由してヒットしたのだけアクセスする。しかしTLBミスした場合
は例外を発生することなく、ノーオペレーション。つまりこれはカレントのア
ドレスマップに依存する。しかし、TLB例外は起こさずに進行したい時用かな。
