EN JA
MALLOC(9)
MALLOC(9) FreeBSD Kernel Developer's Manual MALLOC(9)

名称

malloc, 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);

void
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 にクリアされません。 addrNULL の場合、 free() は、何もしません。

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

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

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

M_ZERO
割り当てられたメモリが全て 0 で満たされるようにします。
M_NODUMP
ページサイズより大きな割り付けに関して、割り付けられたメモリは、カーネルのコアダンプから除外されます。
M_NOWAIT
リソースの不足のため直ちに要求を満たすことができないなら、 malloc(), realloc() と reallocf() は、 NULL を返します。割り込みコンテキストでの動作時には、 M_NOWAIT が要求されることに注意してください。
M_WAITOK
は、リソースを待つことが OK であることを示します。この要求がすぐに満たされることが出来ない場合には、現在のプロセスは、他のプロセスによってリソースが開放されることを待つために、スリープ状態に置かれます。 M_WAITOK が指定されると malloc(), realloc(), reallocf() 関数は、 NULL を返すことができません。
M_USE_RESERVE
要求を満たすためにシステムがメモリのリザーブを使用することができることを示します。このオプションは、割り付けがシステムで破滅的な影響のない呼び出し側によって失敗を許容することができないときのみ、 M_NOWAIT と組み合わせて使用されるべきです。

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

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

type は、 MALLOC_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 */ 
 
... 
buf = malloc(sizeof(*buf), M_FOOBUF, M_NOWAIT); 

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

実装に関する注

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

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

コンテキスト

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

malloc(), realloc() と reallocf() は、 M_WAITOK 付きで呼び出したときにはスリープするかもしれません。 free() は、決してスリープしません。

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

戻り値

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

診断

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