キャッシュ

キャッシュの概要

キャッシュとは、大容量で速度の遅いメインメモリとプロセッサとの間に配置する小容量で高速なメモリです。キャッシュは、頻繁にアクセスする一部の「命令」や「データ」をコピーし、プロセッサから高速にアクセスすることで、プログラムの実行速度を上げることができます。一般的に、キャッシュに必要なデータが存在する場合を「キャッシュヒット」、キャッシュに必要なデータが存在しない場合は「キャッシュミス」と言います。

図1

キャッシュを利用する場合の注意点

キャッシュを使用する場合、以下の設定が必要です。

  • ①MMU(第12回参照)または、MPU(メモリプロテクションユニット)で、メモリタイプ(第10回参照)の設定が必要です。
  • ②Cortex-A9は、リセット後、キャッシュを有効にする前に無効にしなければなりません。

キャッシュを使用する場合、プログラムの実行速度を上げることができますが、キャッシュのヒット率により、プログラムの実行時間が変動します。

キャッシュ内蔵のARMプロセッサ

Cortex-Aプロセッサは、複数レベルのキャッシュをサポートしています。

  • ●L1キャッシュはプロセッサに統合され、命令キャッシュとデータキャッシュが搭載されています。
  • ●L2キャッシュの多くは、ユニファイドキャッシュ(*1)として搭載されています。
  • (*1)命令とデータの区別をせず、同一のキャッシュメモリ領域で管理する方式
図2

キャッシュの構造と動作

32KバイトL1 4Wayデータキャッシュを例に、構造を説明します。

  • ①ライン(ライン0からライン255)は8ワードです。
  • ②ラインの更新済み(Dirty)ビットで、ラインがプロセッサで変更されたことを示します。
  • ③ラインは有効(Valid)状態を示します。

0x1000_0100番地をアクセスした場合に、キャッシュは次の動作を行います。

  • ①アドレスのBit 12からBit 5で、ラインを選択しますので、「ライン8」(0x08)を選択します。
  • ②ウェイは、ヴィクティムカウンタが自動的に選択します。
  • ③タグに、アドレスのBit 31からBit 13が記憶されます。
  • ④ラインに0x1000_0100番地から0x1000_011F番地のデータ(8ワード)を保存します。
図3

キャッシュの保守

通常、キャッシュの保守を実施することはありませんが、考慮する場合は注意が必要です。

無効(Invalidate)

キャッシュラインの有効(Valid)ビットをクリアすることで、キャッシュ内で保持している全てのデータが無効になります。

クリーン(Clean)

更新済み(Dirty)キャッシュラインを外部メモリに反映し、キャッシュと外部メモリの内容が一致します。

データキャッシュの動作モード

データキャッシュは、ライトバックとライトスルーの動作モードを設定できます。

ライトバック動作

データキャッシュだけを更新し、メモリは更新されません。

図4

ライトスルー動作

データキャッシュとメモリを更新します。

図5

リードアロケート動作

プロセッサコアが読み込み命令を実施した場合、メモリからキャッシュにラインサイズ単位で読み込みます。読み込みを開始するアドレスは、ラインサイズ単位境界となります。Cortex-A9の場合、キャッシュラインサイズは32バイト(8ワード)単位となります。

図6

ライトアロケート動作

プロセッサコアが書き込み命令を実施した場合、メモリからキャッシュにラインサイズ単位で読み込み後、書き込みを行います。読み込みを開始するアドレスは、ラインサイズ単位境界となります。Cortex-A9の場合、キャッシュラインサイズは32バイト(8ワード)単位となります。

図7