FREE(9) FreeBSD 一般コマンドマニュアル

FREE

前のページ 上に戻る 次のページ

FREE


     #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);


解説

     malloc() 関数はカーネルアドレス空間の初期化されていないメモリを size で指
     定された大きさの 1 つのオブジェクトとして割り当てます。 free() は
     malloc() で先に割り当てられていた addr のアドレスのメモリを再使用するため
     に開放します。メモリは 0 にクリアされません。マクロ版の MALLOC() は機能的
     には

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

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

           free((addr), type)

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

     M_NOWAIT  リソースの不足のため直ちに要求を満たすことができない場合は、
               malloc() が NULL を返すようにします。通常は、 malloc() は他のプ
               ロセスによるリソースの開放を待つために sleep() を呼び出すでしょ
               う。このフラグがセットされていれば、 malloc() はブロックせずに
               NULL を返します。 M_WAITOK が 0 に定義されていることに注意して
               ください。これはブロッキング操作がデフォルトだということです。

     M_ASLEEP  リソースの不足のため直ちに要求を満たすことができない場合は、
               malloc() が asleep() を呼ぶようにします。 M_ASLEEP の単独での使
               用は実用的ではなく、常に M_NOWAIT との論理和(OR)をとって
               malloc() に asleep() を呼ばせ、直ちに NULL を返させます。呼び出
               し側がある時点で await() を呼び、割り当てのリトライをすることが
               期待されています。当のルーチンに依存して、呼び出し側で一時的な
               失敗を上位に連鎖的に伝搬し、実際に malloc() がキューに入れた非
               同期のウェイトをブロックする幾つかの別の高レベルルーチンをもつ
               ことを決めることも出来ます。

     M_WAITOK  リソースを待つことが可能(OK)であることを示します。都合の悪いこ
               とに 0 と定義されているので、直接この値に対して比較したり、フラ
               グとして論理積(AND)をとったりしないように注意されなければなりま
               せん。デフォルトの操作はメモリの割り当てが成功するまでブロック
               します。 M_NOWAIT が指定されると malloc() は単に NULL を返すこ

           /* 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() はすべてのタイプのオブジェクトの格納に適切なように整列されたカー
     ネル仮想アドレスを、または要求が満足できずかつ M_NOWAIT がセットされてい
     る場合に NULL を返します。 M_ASLEEP がセットされていて malloc() が NULL
     を返す場合、副作用として asleep() が呼び出されます。


関連項目

     vmstat(8)


診断

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

           o   panic: ``malloc: bogus type''
           o   panic: ``malloc: allocation too large''
           o   panic: ``malloc: wrong bucket''
           o   panic: ``malloc: lost data''
           o   panic: ``free: address 0x%x out of range''
           o   panic: ``free: type %d out of range''
           o   panic: ``free: unaligned addr <description of object>''
           o   panic: ``free: item modified''
           o   panic: ``free: multiple free[s]''
           o   ``Data modified on freelist: <description of object>''

FreeBSD 4.4                      June 16, 1996                     FreeBSD 4.4

ABELNET VPSサービス