メモリキャッシュ制御機能は、キャッシュの制御やモード設定を行うための機能である。
μT-Kernelにおけるキャッシュについての考え方は、以下の通りである。
基本的には、アプリケーションもデバイスドライバも、キャッシュの存在を意識することなくプログラムしていれば、自動的に適切なキャッシュ制御が行われるべきである。特に、プログラムの移植性を考慮すると、キャッシュのようにシステムへの依存性が強いものは、できるだけアプリケーションプログラムと切り離して扱えるのがよい。そのため、μT-Kernelを使った実際の個々のシステムでは、μT-Kernel自身が自動的にキャッシュの制御を行う方針となっている。
具体的には、通常のプログラムやデータを入れるメモリ等の領域はキャッシュON、I/Oなどの領域はキャッシュOFFとなるようにμT-Kernelがキャッシュの設定を行う。したがって、通常のアプリケーションプログラムが明示的にキャッシュ制御の関数を呼ぶ必要はない。プログラムから意識的にキャッシュ制御を行わなくても、適切なキャッシュ制御が自動的に行われる。
ただし、μT-Kernelによるキャッシュ制御(いわば、デフォルト設定によるキャッシュ制御)だけでは、適切な対応ができない場合もある。たとえば、DMA転送の絡んだ入出力処理を行う場合や、カーネル管理外のメモリ領域を使う場合には、明示的なキャッシュ制御が必要となることがある。また、プログラムを動的にロードあるいは生成(コンパイル)しながら実行するような場合には、データキャッシュと命令キャッシュを適切に同期させるためのキャッシュ制御が必要となることがある。このようなケースで利用することを想定した機能が、メモリキャッシュ制御機能である。
メモリ領域のキャッシュモードを設定する。具体的には、addr
から len
バイトのメモリ領域のキャッシュに対して、mode
で指定した設定を行う。
mode := ( CM_OFF || CM_WB || CM_WT ) | [CM_CONT] CM_OFF キャッシュオフ CM_WB キャッシュオン(ライトバック) CM_WT キャッシュオン(ライトスルー) CM_CONT アドレス(物理アドレス)が連続した領域のみキャッシュ設定を行う ... /* 実装独自のモードを追加してもよい */
mode
に CM_OFF を指定した場合は、キャッシュをフラッシュ(書き戻し)した後に無効化して、キャッシュモードをオフに設定する。
mode
に CM_WT を指定した場合は、キャッシュをフラッシュした後にキャッシュモードをライトスルーに設定する。
mode
に CM_WB を指定した場合は、キャッシュモードをライトバックに設定する。この時にキャッシュフラッシュを行うかどうかは実装依存とする。
mode
に CM_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 となるかは実装依存である。
メモリ領域のキャッシュ制御(フラッシュあるいは無効化)を行う。具体的には、論理アドレス addr
から len
バイトのメモリ領域のキャッシュに対して、mode
で指定した制御を行う。
mode := (CC_FLUSH | CC_INVALIDATE) CC_FLUSH キャッシュのフラッシュ(書き戻し) CC_INVALIDATE キャッシュの無効化 ... /* 実装独自のモード値を追加してもよい */
CC_FLUSH と CC_INVALIDATE は同時に指定可能である。その場合はキャッシュをフラッシュした後に無効化する。
処理が成功すると、処理を行った領域のサイズを返す。
キャッシュモードや属性の異なる領域を跨ぐ範囲を指定してはいけない。例えば、キャッシュオンの領域とキャッシュオフの領域、保護レベルの異なる領域のような異なる属性の領域の境界を跨ぐ範囲を指定してはいけない。このような範囲を指定した場合の動作は保証されない。
キャッシュ制御はハードウェアに依存する部分が多いため、CPUやハードウェア、実装によってその機能の詳細は異なる。指定された領域を指定されたモードで制御するのが基本だが、指定された領域を含めて、より多くの領域に影響を与える場合がある。例えば、以下のような場合がある。
正確な指定範囲のみを制御(フラッシュあるいは無効化)するとは限らない。指定範囲を含む領域が制御されるが、CPUやハードウェア、実装によっては、それ以外の領域(例えば全メモリ)に対しても、フラッシュあるいは無効化が行われる場合がある。
キャッシュオフの領域を指定した場合は、通常は何も行わない。しかしこのケースにおいても、指定範囲以外の領域のキャッシュのフラッシュあるいは無効化が行われる可能性がある。(常に全領域をフラッシュする処理を行うなど)
キャッシュのないシステムでは、何も行わない。
一般に、キャッシュの制御はキャッシュラインサイズ単位で行われる。このため隣接した領域に意図しないキャッシュアクセスが発生する可能性があるので、使用には注意が必要である。