MALLOC
Section: Misc. Reference Manual Pages (9)
索引
jman
BSD mandoc
索引
名称
malloc
MALLOC
free
FREE
realloc
reallocf
MALLOC_DEFINE
MALLOC_DECLARE
- カーネルメモリマネージメントルーチン
索引
書式
In sys/types.h
In sys/malloc.h
Ft void *
Fn malloc unsigned long size struct malloc_type *type int flags
Fn MALLOC space cast unsigned long size struct malloc_type *type int flags
Ft void
Fn free void *addr struct malloc_type *type
Fn FREE void *addr struct malloc_type *type
Ft void *
Fn realloc void *addr unsigned long size struct malloc_type *type int flags
Ft void *
Fn reallocf void *addr unsigned long size struct malloc_type *type int flags
Fn MALLOC_DECLARE type
In sys/param.h
In sys/malloc.h
In sys/kernel.h
Fn MALLOC_DEFINE type shortdesc longdesc
索引
解説
Fn malloc
関数はカーネルアドレス空間の初期化されていないメモリを
Fa size
で指定された大きさの 1 つのオブジェクトとして割り当てます。
Fn free
関数は
Fn malloc
で先に割り当てられていた
Fa addr
のアドレスのメモリを再使用するために解放します。
メモリは 0 にクリアされません。
Fa addr
が
NULL
の場合、
Fn free
は何もしません。
Fn realloc
関数は、以前に割り当てられて
Fa addr
で参照されるメモリの大きさを
Fa size
バイトに変更します。
メモリの内容は、新サイズと旧サイズの小さい方までは、無変更となります。
戻り値は
Fa addr
と違うかもしれないことに注意してください。
要求されたメモリが割り当て不能の場合、
NULL
が返され、
Fa addr
で参照されるメモリは正当で無変更のままとなります。
Fa addr
が
NULL
の場合、
Fn realloc
関数は指定された大きさの
Fn malloc
と同等に振舞います。
Fn reallocf
関数は
Fn realloc
とまったく同じですが、
要求されたメモリを割り当て不能の場合に
渡されたポインタのメモリを解放する点が違います。
マクロ版の
Fn MALLOC
は機能的には
(space) = (cast)malloc((u_long)(size), type, flags)
と同等で、
マクロ版
Fn FREE
は
free((addr), type)
と同等です。
標準Cライブラリの同義関数
(malloc(3)
)
とは異なり、カーネルバージョンは更に 2 つの引数をとります。
引数
Fa flags
は
Fn malloc
の操作上の特性を以下のようにみなします。
- M_ZERO
-
割り当てられたメモリが全て 0 で満たされるようにします。
- M_NOWAIT
-
リソースの不足のため直ちに要求を満たすことができない場合は、
Fn malloc ,
Fn realloc ,
および
Fn reallocf
が
NULL
を返すようにします。
割り込みコンテキストでの動作時には
M_NOWAIT
が要求されることに注意してください。
- M_WAITOK
-
はリソースを待つことが OK であることを示します。
この要求がすぐに満たされることが出来ない場合には、現在のプロセスは、
他のプロセスによってリソースが開放されることを待つために、
スリープ状態に置かれます。
M_WAITOK
が指定されると
Fn malloc ,
Fn realloc ,
Fn reallocf
関数は
NULL
を返すことが出来ません。
- M_USE_RESERVE
-
要求されたメモリを獲得するために、
システムがリザーブ領域を使ってよいことを示します。
このオプションは以前は
M_KERNEL
と呼ばれていましたが、
より明示的に改名されました。
このオプションは軽視されていて、カーネルから徐々に削除されています。
そのため、新たなプログラミングでは使用されない様にするべきです。
厳密に
M_WAITOK
または
M_NOWAIT
のどちらかが指定されなければなりません。
引数
Fa type
はメモリの利用方法の統計をとるためと、
簡単なサニティチェックのために使われています。
これは複数の割り当てを識別するために使用することが可能です。
この統計は
`vmstat -m'
で調べることが出来ます。
Fa type
は
Fn MALLOC_DECLARE
と
Fn MALLOC_DEFINE
マクロを通じて
Vt 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);
Fn MALLOC_DEFINE
を使用するためには、
In sys/param.h
In ( sys/types.h
の代わりに) および
In sys/kernel.h
をインクルードしなければなりません。
索引
戻り値
Fn malloc ,
Fn realloc ,
Fn reallocf
関数はすべてのタイプのオブジェクトの格納に適切なように整列された
カーネル仮想アドレスを返すか、
または要求が満足できず (すなわち
M_NOWAIT
がセットされていることを意味します) に
NULL
を返します。
索引
実装に関する注
1 ページまでの要求に対し、
メモリアロケータは、2 の累乗の大きさの量を割り当てます。
より大きな要求に対しては、1 個以上のページが割り当てられます。
この動作に依存してはなりませんが、
この情報がメモリ使用効率の最適化に有用かもしれません。
プログラマは malloc フラグの
M_NOWAIT
および
M_WAITOK
と、
mbuf(9)
フラグの
M_DONTWAIT
および
M_TRYWAIT
を混乱しないように注意するべきです。
索引
コンテキスト
Fn malloc ,
Fn realloc
および
Fn reallocf
は高速割り込みハンドラから呼び出されることは出来ません。
スレッド化された割り込みから呼び出される時には、
Fa flag
は
M_NOWAIT
を含んでいなければなりません。
Giant
ではない mutex が保持されている間は、
Fn malloc ,
Fn realloc
および
Fn reallocf
は
M_WAITOK
付きで呼び出したときにはスリープするかもしれません。
Fn free
は決してスリープしません。
vnode(9)
インタロックを保持している時の
Fn malloc
( M_NOWAIT
付であっても) または
Fn free
への全ての呼出しは、VM オブジェクトと vnode の相互のからみ合いのために、
LOR (ロック順序の逆転) を引き起こします。
索引
関連項目
vmstat(8),
contigmalloc(9),
vnode(9)
索引
診断
INVARIANTS
コンフィギュレーションオプションを付けてコンパイルされたカーネルは、
割り当てられた領域以外への書き込みや
Fn malloc
関数と
Fn free
関数の不均衡な呼び出しなどにより生じたメモリ不正の検出を試みます。
一貫性チェックの失敗はパニックまたはシステムコンソールメッセージを出力します。
索引
Index
- 名称
-
- 書式
-
- 解説
-
- 戻り値
-
- 実装に関する注
-
- コンテキスト
-
- 関連項目
-
- 診断
-
Time: 07:07:57 GMT, January 12, 2009