キャッシュの概要
キャッシュとは、大容量で速度の遅いメインメモリとプロセッサとの間に配置する小容量で高速なメモリです。キャッシュは、頻繁にアクセスする一部の「命令」や「データ」をコピーし、プロセッサから高速にアクセスすることで、プログラムの実行速度を上げることができます。一般的に、キャッシュに必要なデータが存在する場合を「キャッシュヒット」、キャッシュに必要なデータが存在しない場合は「キャッシュミス」と言います。
キャッシュを利用する場合の注意点
キャッシュを使用する場合、以下の設定が必要です。
- MMU(第12回参照)または、MPU(メモリプロテクションユニット)で、メモリタイプ(第10回参照)の設定が必要です。
- Cortex-A9は、リセット後、キャッシュを有効にする前に無効にしなければなりません。
キャッシュを使用する場合、プログラムの実行速度を上げることができますが、キャッシュのヒット率により、プログラムの実行時間が変動します。
キャッシュ内蔵のArmプロセッサ
Cortex-Aプロセッサは、複数レベルのキャッシュをサポートしています。
- L1キャッシュはプロセッサに統合され、命令キャッシュとデータキャッシュが搭載されています。
- L2キャッシュの多くは、ユニファイドキャッシュ(*1)として搭載されています。
(*1)命令とデータの区別をせず、同一のキャッシュメモリ領域で管理する方式
キャッシュの構造と動作
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ワード)を保存します。
キャッシュの保守
通常、キャッシュの保守を実施することはありませんが、考慮する場合は注意が必要です。
無効(Invalidate)
キャッシュラインの有効(Valid)ビットをクリアすることで、キャッシュ内で保持している全てのデータが無効になります。
クリーン(Clean)
更新済み(Dirty)キャッシュラインを外部メモリに反映し、キャッシュと外部メモリの内容が一致します。
データキャッシュの動作モード
データキャッシュは、ライトバックとライトスルーの動作モードを設定できます。
ライトバック動作
データキャッシュだけを更新し、メモリは更新されません。
ライトスルー動作
データキャッシュとメモリを更新します。
リードアロケート動作
プロセッサコアが読み込み命令を実施した場合、メモリからキャッシュにラインサイズ単位で読み込みます。読み込みを開始するアドレスは、ラインサイズ単位境界となります。Cortex-A9の場合、キャッシュラインサイズは32バイト(8ワード)単位となります。
ライトアロケート動作
プロセッサコアが書き込み命令を実施した場合、メモリからキャッシュにラインサイズ単位で読み込み後、書き込みを行います。読み込みを開始するアドレスは、ラインサイズ単位境界となります。Cortex-A9の場合、キャッシュラインサイズは32バイト(8ワード)単位となります。
こちらも是非
“もっと見る” Cortex-A編
初期化処理
リセット例外からmain()関数を呼び出すまでの初期化は、ユーザが作成する部分とArmコンパイラが実行する部分に分けることができます。コードのコピーや初期化変数/未初期化変数の初期化は、リンカのメモリ配置設定を処理系ライブラリが実行します。
PMU(パフォーマンス監視ユニット)
PMUに関連するレジスタは、ユーザモードでのアクセスは禁止されていますので、PMUSERENR(ユーザイネーブルレジスタ)を特権モードでユーザモードアクセス許可を設定します。PMUSERENRについては、 後述の該当項目を参照ください。
TrustZone(セキュリティ拡張機能)
TrustZoneはCortex-Aシリーズの拡張機能で、大規模OSやアプリケーションが動作するノーマルワールドとセキュリティ関連が動作するセキュアワールドを導入しています。TrustZoneでは、ノーマルワールドメモリ空間とセキュアワールドメモリ空間の分離が可能です。