メモリキャッシュ制御機能

メモリキャッシュ制御機能は、キャッシュの制御やモード設定を行うための機能である。

μT-Kernelにおけるキャッシュについての考え方は、以下の通りである。

基本的には、アプリケーションもデバイスドライバも、キャッシュの存在を意識することなくプログラムしていれば、自動的に適切なキャッシュ制御が行われるべきである。特に、プログラムの移植性を考慮すると、キャッシュのようにシステムへの依存性が強いものは、できるだけアプリケーションプログラムと切り離して扱えるのがよい。そのため、μT-Kernelを使った実際の個々のシステムでは、μT-Kernel自身が自動的にキャッシュの制御を行う方針となっている。

具体的には、通常のプログラムやデータを入れるメモリ等の領域はキャッシュON、I/Oなどの領域はキャッシュOFFとなるようにμT-Kernelがキャッシュの設定を行う。したがって、通常のアプリケーションプログラムが明示的にキャッシュ制御の関数を呼ぶ必要はない。プログラムから意識的にキャッシュ制御を行わなくても、適切なキャッシュ制御が自動的に行われる。

ただし、μT-Kernelによるキャッシュ制御(いわば、デフォルト設定によるキャッシュ制御)だけでは、適切な対応ができない場合もある。たとえば、DMA転送の絡んだ入出力処理を行う場合や、カーネル管理外のメモリ領域を使う場合には、明示的なキャッシュ制御が必要となることがある。また、プログラムを動的にロードあるいは生成(コンパイル)しながら実行するような場合には、データキャッシュと命令キャッシュを適切に同期させるためのキャッシュ制御が必要となることがある。このようなケースで利用することを想定した機能が、メモリキャッシュ制御機能である。

SetCacheMode - キャッシュモードの設定

C言語インタフェース

#include <tk/tkernel.h>

SZ rlen = SetCacheMode(void *addr, SZ len, UINT mode);

パラメータ

void* addr Start Address先頭アドレス
SZ len Length領域サイズ(バイト数)
UINT mode Modeキャッシュモード

リターンパラメータ

SZ rlen Result Lengthキャッシュモードを設定できた領域のサイズ(バイト数)
またはError Codeエラーコード

エラーコード

E_OK 正常終了
E_PAR パラメータエラー(addr, len, mode が不正あるいは利用できない)
E_NOSPT 未サポート機能(mode で指定した機能が未サポート)

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

関連するサービスプロファイル

以下のサービスプロファイルがすべて有効に設定されている場合に限り、本APIはサポートされる。

TK_SUPPORT_CACHECTRL メモリキャッシュ制御機能のサポート
TK_SUPPORT_SETCACHEMODE キャッシュモード設定機能のサポート

また、以下のサービスプロファイルが本APIに関係する。

TK_SUPPORT_WBCACHE キャッシュモードにライトバック(CM_WB)が指定可能
TK_SUPPORT_WTCACHE キャッシュモードにライトスルー(CM_WT)が指定可能

解説

メモリ領域のキャッシュモードを設定する。具体的には、addr から len バイトのメモリ領域のキャッシュに対して、mode で指定した設定を行う。


mode := ( CM_OFF || CM_WB || CM_WT ) | [CM_CONT]
                CM_OFF  キャッシュオフ
                CM_WB   キャッシュオン(ライトバック)
                CM_WT   キャッシュオン(ライトスルー)
                CM_CONT アドレス(物理アドレス)が連続した領域のみキャッシュ設定を行う
                   ...
                /* 実装独自のモードを追加してもよい */

modeCM_OFF を指定した場合は、キャッシュをフラッシュ(書き戻し)した後に無効化して、キャッシュモードをオフに設定する。

modeCM_WT を指定した場合は、キャッシュをフラッシュした後にキャッシュモードをライトスルーに設定する。

modeCM_WB を指定した場合は、キャッシュモードをライトバックに設定する。この時にキャッシュフラッシュを行うかどうかは実装依存とする。

modeCM_CONT を指定した場合は、addr からアドレス(物理アドレス)が連続した領域のみキャッシュモード設定を行う。指定した領域内にメモリ割り当てのない部分があった場合は、その直前で処理を中止し、処理が完了した領域のサイズを返す。CM_CONT を指定しなかった場合は、指定したすべての領域のキャッシュを処理し、処理が完了した領域のサイズを返す。

CPUや実装によっては、キャッシュモードの一部、あるいは全部の設定が不可能な場合がある。設定不可能なモードを指定した場合は、何も処理せず E_NOSPT を返す。

len は1以上とする。0以下の数を指定した場合はエラーコード E_PAR を返す。

補足事項

キャッシュモードの設定は、一般にはページなど大きな領域を単位として行われるため、addr がその領域の先頭ではない場合であっても、addr が含まれる領域全体が設定対象となる。また、隣接した領域に対しても、意図しないキャッシュアクセスが発生する可能性があるので、使用には注意が必要である。

ハードウェア構成やCPUの持つキャッシュの機能に依存して、さらに詳細なキャッシュモードの設定を行いたい場合は、実装独自の mode を追加して利用する。たとえば、NORMAL CACHE OFF (Weakly Order), DEVICE CACHE OFF (Weakly Order), STRONG ORDER などのキャッシュモードを指定可能な場合がある。

利用できない mode を指定した場合のエラーが E_NOSPT となるか E_PAR となるかは実装依存である。

ControlCache - キャッシュの制御

C言語インタフェース

#include <tk/tkernel.h>

SZ rlen = ControlCache(void *addr, SZ len, UINT mode);

パラメータ

void* addr Start Address先頭アドレス
SZ len Length領域サイズ(バイト数)
UINT mode Mode制御モード

リターンパラメータ

SZ rlen Result Lengthキャッシュモードを設定できた領域のサイズ(バイト数)
またはError Codeエラーコード

エラーコード

E_OK 正常終了
E_PAR パラメータエラー(addr, len, mode が不正)
E_NOSPT 未サポート機能(mode で指定した機能が未サポート)

利用可能なコンテキスト

タスク部準タスク部タスク独立部
×

関連するサービスプロファイル

以下のサービスプロファイルが有効に設定されている場合に限り、本APIはサポートされる。

TK_SUPPORT_CACHECTRL メモリキャッシュ制御機能のサポート

解説

メモリ領域のキャッシュ制御(フラッシュあるいは無効化)を行う。具体的には、論理アドレス addr から len バイトのメモリ領域のキャッシュに対して、mode で指定した制御を行う。


mode := (CC_FLUSH | CC_INVALIDATE)
                CC_FLUSH        キャッシュのフラッシュ(書き戻し)
                CC_INVALIDATE   キャッシュの無効化
                     ...
                /* 実装独自のモード値を追加してもよい */

CC_FLUSHCC_INVALIDATE は同時に指定可能である。その場合はキャッシュをフラッシュした後に無効化する。

処理が成功すると、処理を行った領域のサイズを返す。

キャッシュモードや属性の異なる領域を跨ぐ範囲を指定してはいけない。例えば、キャッシュオンの領域とキャッシュオフの領域、保護レベルの異なる領域のような異なる属性の領域の境界を跨ぐ範囲を指定してはいけない。このような範囲を指定した場合の動作は保証されない。

キャッシュ制御はハードウェアに依存する部分が多いため、CPUやハードウェア、実装によってその機能の詳細は異なる。指定された領域を指定されたモードで制御するのが基本だが、指定された領域を含めて、より多くの領域に影響を与える場合がある。例えば、以下のような場合がある。

  • 正確な指定範囲のみを制御(フラッシュあるいは無効化)するとは限らない。指定範囲を含む領域が制御されるが、CPUやハードウェア、実装によっては、それ以外の領域(例えば全メモリ)に対しても、フラッシュあるいは無効化が行われる場合がある。

  • キャッシュオフの領域を指定した場合は、通常は何も行わない。しかしこのケースにおいても、指定範囲以外の領域のキャッシュのフラッシュあるいは無効化が行われる可能性がある。(常に全領域をフラッシュする処理を行うなど)

  • キャッシュのないシステムでは、何も行わない。

一般に、キャッシュの制御はキャッシュラインサイズ単位で行われる。このため隣接した領域に意図しないキャッシュアクセスが発生する可能性があるので、使用には注意が必要である。