スポンサーリンク

MALLOC(9) FreeBSD カーネル開発者マニュアル MALLOC(9)

名称

malloc, MALLOC, free, FREE, realloc, reallocf, MALLOC_DEFINE, MALLOC_DECLARE − カーネルメモリマネージメントルーチン

書式

#include <sys/types.h>
#include <sys/malloc.h>

void *

malloc(unsigned long size, struct malloc_type *type, int flags);

MALLOC(space, cast, unsigned long size, struct malloc_type *type, int flags);

void

free(void *addr, struct malloc_type *type);

FREE(void *addr, struct malloc_type *type);

void *

realloc(void *addr, unsigned long size, struct malloc_type *type, int flags);

void *

reallocf(void *addr, unsigned long size, struct malloc_type *type, int flags);

MALLOC_DECLARE(type);

#include <sys/param.h>

#include <sys/malloc.h>
#include <sys/kernel.h>

MALLOC_DEFINE(type, shortdesc, longdesc);

解説

malloc() 関数はカーネルアドレス空間の初期化されていないメモリを size で指 定された大きさの 1 つのオブジェクトとして割り当てます。

free() 関数は malloc() で先に割り当てられていた addr のアドレスのメモリを 再使用するために解放します。メモリは 0 にクリアされません。 addr が NULL の場合、 free() は何もしません。

realloc() 関数は、以前に割り当てられて addr で参照されるメモリの大きさを size バイトに変更します。メモリの内容は、新サイズと旧サイズの小さい方まで は、無変更となります。戻り値は addr と違うかもしれないことに注意してくだ さい。要求されたメモリが割り当て不能の場合、 NULL が返され、 addr で参照 されるメモリは正当で無変更のままとなります。 addr が NULL の場合、 realloc() 関数は指定された大きさの malloc() と同等に振舞います。

reallocf() 関数は realloc() とまったく同じですが、要求されたメモリを割り 当て不能の場合に渡されたポインタのメモリを解放する点が違います。

マクロ版の MALLOC() は機能的には

      (space) = (cast)malloc((u_long)(size), type, flags)

と同等で、マクロ版 FREE() は

      free((addr), type)

と同等です。標準Cライブラリの同義関数 (malloc(3)) とは異なり、カーネル バージョンは更に 2 つの引数をとります。引数 flagsmalloc() の操作上の 特性を以下のようにみなします。

       M_ZERO

割り当てられたメモリが全て 0 で満たされるようにします。

M_NOWAIT
リソースの不足のため直ちに要求を満たすことができない場合は、 malloc(), realloc(), および reallocf() が NULL を返すようにしま す。割り込みコンテキストでの動作時には M_NOWAIT が要求されること に注意してください。

M_WAITOK
はリソースを待つことが OK であることを示します。この要求がすぐに 満たされることが出来ない場合には、現在のプロセスは、他のプロセス によってリソースが開放されることを待つために、スリープ状態に置か れます。 M_WAITOK が指定されると malloc(), realloc(), reallocf() 関数は NULL を返すことが出来ません。

M_USE_RESERVE
要求されたメモリを獲得するために、システムがリザーブ領域を使って よいことを示します。このオプションは以前は M_KERNEL と呼ばれてい ましたが、より明示的に改名されました。このオプションは軽視されて いて、カーネルから徐々に削除されています。そのため、新たなプログ ラミングでは使用されない様にするべきです。

厳密に M_WAITOK または M_NOWAIT のどちらかが指定されなければなりません。

引数 type はメモリの利用方法の統計をとるためと、簡単なサニティチェックの ために使われています。これは複数の割り当てを識別するために使用することが 可能です。この統計は ‘vmstat -m’ で調べることが出来ます。

typeMALLOC_DECLARE() と MALLOC_DEFINE() マクロを通じて struct malloc_type typedef を使用して定義されます。

/* sys/something/foo_extern.h */

MALLOC_DECLARE(M_FOOBUF);

/* sys/something/foo_main.c */

MALLOC_DEFINE(M_FOOBUF, "foobuffers",
"Buffers to foo data into the ether");

/* sys/something/foo_subr.c */

...

MALLOC(buf, struct foo_buf *, sizeof *buf, M_FOOBUF, M_NOWAIT);

MALLOC_DEFINE() を使用するためには、 <sys/param.h> (<sys/types.h> の代わ りに) および <sys/kernel.h> をインクルードしなければなりません。

戻り値

malloc(), realloc(), reallocf() 関数はすべてのタイプのオブジェクトの格納 に適切なように整列されたカーネル仮想アドレスを返すか、または要求が満足で きず (すなわち M_NOWAIT がセットされていることを意味します) に NULL を返 します。

実装に関する注

1 ページまでの要求に対し、メモリアロケータは、2 の累乗の大きさの量を割り 当てます。より大きな要求に対しては、1 個以上のページが割り当てられます。 この動作に依存してはなりませんが、この情報がメモリ使用効率の最適化に有用 かもしれません。

プログラマは malloc フラグの M_NOWAIT および M_WAITOK と、 mbuf(9) フラグ の M_DONTWAIT および M_TRYWAIT を混乱しないように注意するべきです。

コンテキスト

malloc(), realloc() および reallocf() は高速割り込みハンドラから呼び出さ れることは出来ません。スレッド化された割り込みから呼び出される時には、 flag は M_NOWAIT を含んでいなければなりません。

Giant ではない mutex が保持されている間は、 malloc(), realloc() および reallocf() は M_WAITOK 付きで呼び出したときにはスリープするかもしれませ ん。 free() は決してスリープしません。

vnode(9) インタロックを保持している時の malloc() (M_NOWAIT 付であっても) または free() への全ての呼出しは、VM オブジェクトと vnode の相互のからみ 合いのために、 LOR (ロック順序の逆転) を引き起こします。

関連項目

vmstat(8), contigmalloc(9), vnode(9)

診断

INVARIANTS コンフィギュレーションオプションを付けてコンパイルされたカーネ ルは、割り当てられた領域以外への書き込みや malloc() 関数と free() 関数の 不均衡な呼び出しなどにより生じたメモリ不正の検出を試みます。一貫性チェッ クの失敗はパニックまたはシステムコンソールメッセージを出力します。

FreeBSD 10.0 June 12, 2003 FreeBSD 10.0

スポンサーリンク