この章では、μT-Kernel/SM(System Manager)で提供している機能の詳細について説明を行う。
全般的な注意・補足事項 | |
---|---|
|
システムメモリ管理機能は、μT-Kernelが動的に割り当てるすべてのメモリ(システムメモリ)を管理するための機能である。μT-Kernel内部で使用しているメモリやタスクのスタック、メッセージバッファ、メモリプールなどもここから割り当てる。
システムメモリ管理機能は、システムメモリを細分化して管理するメモリ割当てライブラリからなる。
システムメモリ管理機能は、μT-Kernelの内部で利用するほか、アプリケーションやサブシステム、デバイスドライバなどからも利用可能である。
メモリ割当てライブラリは、C言語標準ライブラリの malloc
/calloc
/realloc
/free
と同等の機能が提供される。
これらのメモリは、すべて TSVCLimit
で指定された保護レベルのメモリとして割り当てられる。
なし
size
で指定したバイト数のメモリを割り当て、その先頭アドレスを addr
に返す。
指定したサイズのメモリの割当てができなかった場合や、size
に0が指定された場合は、addr
に NULL が返る。
Kmalloc を含むメモリ割当てライブラリのAPIは、タスク独立部およびディスパッチ禁止中、割込み禁止中に呼び出すことはできない。呼び出した場合の動作は、システムダウンの可能性も含めて不定であり、呼出時の状態を保証するのは、呼出側の責任である。
size
には任意の値を指定できるが、管理領域の確保や、割り当てるメモリアドレスのアラインメントの調整といった理由により、内部的には、size
で指定したバイト数よりも大きなメモリが割り当てられる場合がある。たとえば、割当て可能なメモリサイズの最低が16バイトで、アラインメントが8バイト単位という実装の場合には、size
に16バイト未満の値を指定した場合でも、内部的には16バイトのメモリが割り当てられる。また、size
に20バイトの値を指定した場合でも、内部的には24バイトのメモリが割り当てられる。
なし
size
で指定したバイト数のメモリブロックを、nmemb
で指定された個数だけ連続して割り当て、0クリアしてから、その先頭アドレスを addr
に返す。メモリ割当ての動作は、size
と nmemb
を乗じたバイト数のメモリブロック1個を割り当てるのと同じである。
指定した個数のメモリブロックの割当てができなかった場合や、nmemb
または size
に0が指定された場合は、addr
に NULL が返る。
Kcalloc を含むメモリ割当てライブラリのAPIは、タスク独立部およびディスパッチ禁止中、割込み禁止中に呼び出すことはできない。呼び出した場合の動作は、システムダウンの可能性も含めて不定であり、呼出時の状態を保証するのは、呼出側の責任である。
なし
ptr
で指定した割当て済のメモリのサイズを、size
で指定されたサイズに変更する。その際にメモリの再割当てを行い、再割当て後のメモリの先頭アドレスを addr
に返す。
サイズ変更をともなうメモリの再割当てにより、一般にはメモリの先頭アドレスが移動し、addr
は ptr
と異なった値になる。ただし、その場合でも、再割当ての対象となったメモリの内容は保存される。このため、Krealloc の処理の中でメモリ内容のコピーを行う。また、再割当てにより不要になったメモリは解放される。
ptr
には、Kmalloc、Kcalloc、Krealloc で割り当てられたメモリの先頭アドレスを指定する必要がある。ptr
の正当性は呼出側で保証しなければならない。
ptr
に NULL を指定した場合は、新しいメモリの割当てのみを行う。この場合の動作は Kmalloc と同一である。
指定したサイズのメモリの再割当てができなかった場合や、size
に0が指定された場合は、addr
に NULL が返る。このとき、ptr
に NULL 以外が指定されていれば、ptr
のメモリの解放だけを行う。この場合の動作は Kfree と同一である。
Krealloc を含むメモリ割当てライブラリのAPIは、タスク独立部およびディスパッチ禁止中、割込み禁止中に呼び出すことはできない。呼び出した場合の動作は、システムダウンの可能性も含めて不定であり、呼出時の状態を保証するのは、呼出側の責任である。