- ベストアンサー
非キャッシュ領域へのキャッシュデータの上書き
こんにちは。どなたかご存知でしたら教えてください。 とあるCPUのキャッシュラインサイズが32バイトで、 非キャッシュアクセスするグローバル変数Aのアドレスがが32バイト境界上になく、 かつ、変数Aの直前の領域がキャッシュアクセスする領域の場合、 変数Aの先頭の領域がキャッシュの影響を受けて意図しないデータで つぶされる(上書きされる)可能性はあるのでしょうか? 非キャッシュアクセスするグローバル変数は必ずキャッシュラインサイズで境界調整する必要があるのでしょうか? 以上、よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
そういえばSH系は同じ物理アドレスにキャッシュ空間と非キャッシュ空間がマップされてましたね。DMAとかCPU以外のものがアクセスする場合は使用前にキャッシュパージしてください。 変数としてのアクセスも単にキャッシュラインを分けるだけで足りるか自信ないです。むしろアクセスする非キャッシュ空間アドレスに対応するキャッシュ空間アドレスをキャッシュパージしておく方が良いと思います。
その他の回答 (2)
- rinkun
- ベストアンサー率44% (706/1571)
> キャッシュパージ キャッシュのフラッシュといったほうが用語として正しかったかも。 何にせよキャッシュとメモリの整合を取る命令です。 キャッシュが更新されていればメモリに書き出して、キャッシュのデータを無効にします。キャッシュライン単位でフラッシュできたと思います。
- rinkun
- ベストアンサー率44% (706/1571)
どんなCPUとどんな言語を使って書いてるか分かりませんけど、普通はキャッシュされる変数と非キャッシュの変数を同じキャッシュラインに配置することなんてできないんじゃないですか? # 普通キャッシュ領域と非キャッシュ領域はページ単位でアラインされてるのでは? むしろどうやって同じキャッシュラインに乗るように配置するのか興味があります。
補足
コメントありがとうございます。 >どんなCPUとどんな言語を使って書いてるか分かりませんけど、 ルネサスのSH系のチップで、C言語で記述しています。 >普通キャッシュ領域と非キャッシュ領域はページ単位でアラインされてるのでは? 普通にグローバル領域を宣言してソフトウェアからアクセスして使用する分にはキャッシュアクセスなのですが、その領域をCPUのMMUを介さないでアクセスする場合(例えばDMAとか)は非キャッシュアクセスとなるようです。
お礼
キャッシュパージですか。ネットで調べてみたらキャッシュを無効化する操作のようですね。使えるかどうか検討してみます。 ありがとうございます。