キャッシュ(後編)

制御レジスタと識別レジスタ

L1キャッシュ制御レジスタ(CACR)

CACRは、L1のECCおよびL1キャッシュ一貫性用法モデルをコントロールします。

図1

【CACR – 0xE000EF9C (R/W)】

L1キャッシュ識別レジスタ

識別レジスタの一覧を下表に示します。

アドレス レジスタ名 機能
0xE000ED14 設定とコントロールレジスタ(CCR) 構造と制御データのセットまたはリターンを行い、キャッシュとブランチ予測の管理を行います。
0xE000ED78 キャッシュレベルIDレジスタ(CLIDR) 実装されるキャッシュ・レベルを示します。アーキテクチャ的に、命令とデータのキャッシュ・レベル数が異なることがあります。
0xE000ED7C キャッシュタイプレジスタ(CTR) キャッシュの構造に関する情報を提供します。
0xE000ED80 キャッシュサイズIDレジスタ(CCSIDR) 選択された命令/データ・キャッシュのサイズと動作に関する情報を提供します。アーキテクチャ的に、最高8レベルのキャッシュが可能です。命令/データまたは統一キャッシュを含みます。L1命令/データ・キャッシュだけを含みます。
0xE000ED84 キャッシュサイズ選択レジスタ(CSSELR) CSSELRは、以下を指定することによって現在のCCSIDRを選びます。
  • ●要求されるキャッシュレベル
  • ●キャッシュタイプ
    • ー命令キャッシュ(メモリ・システムが命令とデータ・キャッシュを別々に実装する場合)
    • ーデータキャッシュ(データ・キャッシュ引数が、統一キャッシュのために使われる必要があります)

ユニフィケーションと一貫性のポイント

前書き

Cortex-Aで採用されているユニフィケーションのポイント(Point of unification:PoU)と一貫性のポイント(Point of coherency:PoC)の考え方がCortex-M7でも採用されています。ただし、Cortex-M7には、L2以降のキャッシュは内蔵されていませんので、マイコンベンダーがL2以降のキャッシュを搭載していない場合は、L1キャッシュとシステムメモリ(内蔵のFlashやSRAM等)の関係が対象となります。

ユニフィケーションのポイント(Point of unification:PoU)

プロセッサのためのユニフィケーションのポイント(Point of unification:PoU)は、命令とデータ・キャッシュがメモリの場所の同じコピーを見ことを保証するものです。Cortex-AではL2統合キャッシュ(命令とデータを両方含むキャッシュ)が前提ですが、Cortex-M7ではL2統合キャッシュは搭載されていないため、命令とデータを両方含むシステムメモリ、すなわち内蔵Flashや内蔵RAMが対象になります。PoUは、命令とデータ・キャッシュが結合した単一プロセッサ・メモリ・システムです。

図2

一貫性のポイント(Point of coherency:PoC)

特定のMVA(修正された仮想アドレス:Modified Virtual Address)のため、一貫性のポイント(Point of coherency:PoC)は、メモリにアクセスすることが可能なすべてのエージェントが、メモリの場所の同じコピーを見ることを保証するものです。Cortex-M7では、これも対象は、メインシステム・メモリです。ここで、エージェントとは、ユーザーや他のソフトウェアの代理・仲介を果たすソフトウェア。またはユーザーの代わりに動くソフトウェアを指します。

図3

メンテナンス操作

キャッシュメンテナンス操作レジスタ

すべてのキャッシュメンテナンス操作は、下表のレジスタを使って行います。 これらは、内部のPPBメモリスペースのメモリマップの作成システム制御スペース(SCS)空間にあります。キャッシュメンテナンス操作は、特権モードでしかロード/ストアできません、非特権モードで行うとBusFaultが発生します。

アドレス レジスタ名 機能
0xE000EF50 ICIALLU 命令キャッシュをすべて無効にする
0xE000EF58 ICIMVAU PoUへのアドレスによる命令キャッシュの無効化
0xE000EF5C DCIMVAC PoCへのアドレスによるデータキャッシュの無効化
0xE000EF60 DCISW データキャッシュのセット、ウェイを指定して無効化
0xE000EF64 DCCMVAU PoUへのアドレスによるデータキャッシュクリーン化
0xE000EF68 DCCMVAC PoCへのアドレスによるデータキャッシュクリーン化
0xE000EF6C DCCSW データキャッシュのセット、ウェイを指定してクリーン化
0xE000EF70 DCCIMVAC PoCへのアドレスによるデータキャッシュクリーン化と無効化
0xE000EF74 DCCISW データキャッシュのセット、ウェイを指定してクリーン化と無効化

キャッシュメンテナンス命令

(1)DSB(データ同期バリア/Data synchronization barrier)命令

DSBは特別なデータ同期メモリバリアとして作動します。この命令以前のすべてのメモリアクセスが完了するまで、以後の命令を実行しないようにプロセッサを待機状態にします。したがって、これより以前のすべてキャッシュメンテナンス操作の完了が保証されます。

(2)ISB(命令同期バリア/Instruction synchronization barrier)命令

ISBは命令同期バリアとして作動します。これによりプロセッサのパイプラインは破棄されます。従ってISBの後の命令は、ISBが完了した後に再びキャッシュまたはメモリから取り出されます。これにより、その後の「命令フェッチ」のために命令キャッシュメンテナンス操作が見えることが保証されます。(ライトバッファとバリア命令(Cortex-A編 第11回参照)

初期化と有効化

キャッシュの初期化と有効化

パワーオンリセット時に、ソフトウェアにおいて、命令キャッシュとデータキャッシュを有効化する前に、それらを一旦完全に無効にしなければなりません。キャッシュライン有効ビットはタグ(キャッシュRAM内)に保持されます。これに失敗すると予想できない現象が引き起こされます。また、ソフトウエアリセットの場合、リセットの際のキャッシュの中身が信頼できるものであるならば、無効化は必要ありません。

データキャッシュ全体の無効化

ソフトウェアは、データキャッシュ全体を無効にするために、以下のサンプルコードを使うことができます。操作は、キャッシュの個々のライン上で繰返し行われます。ラインの無効化は、Private Peripheral Bus(PPB)メモリ領域でのDCISWレジスターを使用することによって行います。キャッシュのウェイとセットの数は、CCSIDRレジスターを読むことによって決まります。

									CCSIDR EQU 0xE000ED80
									CSSELR EQU 0xE000ED84
									DCISW EQU 0xE000EF60

									    MOV r0, #0x0
									   LDR r11, =CSSELR
									  STR r0, [r11] ; Select Data Cache size
									  DSB
									  LDR r11, =CCSIDR
									  LDR r2, [r11] ; Cache size identification
									  AND r1, r2, #0x7 ; Number of words in a cache line
									  ADD r7, r1, #0x4
									  MOV r1, #0x3ff
									  ANDS r4, r1, r2, LSR #3
									  MOV r1, #0x7fff
									  ANDS r2, r1, r2, LSR #13
									  CLZ r6, r4

									  LDR r11, =DCISW

									inv_loop1
									  MOV r1, r4
									inv_loop2
									  LSL r3, r1, r6
									  LSL r8, r2, r7
									  ORRr 3, r3, r8

									  STR r3, [r11] ; Invalidate D-cache line

									  SUBS r1, r1, #0x1
									  BGE inv_loop2
									  SUBS r2, r2, #0x1
									  BGE inv_loop1

									  DSB
									  ISB
								

命令キャッシュの無効化

命令キャッシュを無効にするのは、以下のサンプルコードで行うことができます。操作は、PPBメモリ領域のICIALLUレジスターに書きこむことによって行われます。

									ICIALLU EQU 0xE000EF50
									  MOV r0, #0x0
									  LDR r11, =ICIALLU
									  STR r0, [r11]

									  DSB
									  ISB
								

データキャッシュと命令キャッシュの有効化

データキャッシュと命令キャッシュは、初期化の後、以下のサンプルコードを使って有効化できます。操作は、PPBメモリ領域のCCR.ICとCCR.DCフィールドを修正することによって実行されます。

									CCR EQU 0xE000ED14

									   LDR r11, =CCR
									   LDR r0, [r11]
									   ORR r0, r0, #0x1:SHL:16 ; Set CCR.DC field
									   ORR r0, r0, #0x1:SHL:17 ; Set CCR.IC field
									   STR r0, [r11]
									   DSB
									   ISB
								

メモリタイプと属性

ARMプロセッサでは、メモリタイプとして3種類を定義しており、用途によって設定しなければなりません。メモリタイプの設定は、MPUで定義します。(ちなみに、Cortex-M7とCortex-RはMPUで行い、Cortex-Aの場合はMMUで行います)

Cortexのメモリタイプについては、Cortex-A編でも説明していますので、「メモリタイプとアクセスオーダ(Cortex-A編 第10回参照)」の章を参照してください。

Normal

プロセッサは効率化のために、処理の並び替えが可能です。また、投機的読み出しを実行できます。

DeviceとStrongly-ordered

メモリ領域をDeviceまたはStrongly-orderedメモリに定義すると、プロセッサーは、これらのメモリに関連する他の処理の順番を守ります。DeviceとStrongly-orderedメモリへの異なる順番の要求は、外部メモリ・システムが、Deviceメモリへの書き込みをバッファできるということになります。しかし、Strongly-orderedメモリへの書き込みをバッファリングすることはできません。

共有可能(Shareable)

メモリシステムは、システムの複数のバス・マスターの間のデータ同期を提供します。例えば、DMAコントローラ付きのプロセッサが該当します。Strongly-orderedメモリは常に共有可能です。もし、複数のバス・マスターが共有可能ではないメモリ領域にアクセス可能ならば、ユーザーはソフトウェアでバス・マスターの間のデータ一貫性を保証しなければなりません。

エグゼキューションネバー(Execute Never:XN)

これはプロセッサが命令アクセスを防止するという意味です。XN領域から命令実行を行うと、例外フォールトが発生します。