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

名称

contigmalloc, contigfree連続するカーネル物理メモリを管理する

書式

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

void *
contigmalloc( unsigned long size, struct malloc_type *type, int flags, vm_paddr_t low, vm_paddr_t high, unsigned long alignment, vm_paddr_t boundary);

void
contigfree( void *addr, unsigned long size, struct malloc_type *type);

解説

contigmalloc() 関数は、 alignment バイトに整列され、 boundary バイトの境界に交差しない、 size バイトの連続する物理メモリを割り付けます。成功すれば、割り付けは、物理アドレス lowhigh の間に存在します。返されたポインタは、カーネル仮想アドレス (KVA) マップから割り付けられた size バイトの決め打ちされたカーネル仮想アドレス範囲を指します。

flags パラメータは、次のように contigmalloc() の振る舞いを変更します:

M_ZERO
割り付けられた物理メモリを 0 で満たします。
M_NOWAIT
contigmalloc() は、リソース不足のために直ちに要求を満足させることができないなら、 NULL を返します。

他のフラグ (存在しているなら) は、無視されます。

contigfree() 関数は、 contigmalloc() の前の呼び出しで割り当てられたメモリを解放します。

実装に関する注

contigmalloc() 関数は、メモリリソースを解放するために待ってスリープしませんが、あきらめる前に、代わりに積極的にページを取り戻します。しかしながら、 M_NOWAIT が指定されないなら、最初に補助記憶装置に書き込まなければならない再利用のための 1 つのページ選択し、スリープします。

戻り値

contigmalloc() 関数は、割り付けが成功すれば、カーネル仮想アドレスに返し、そうでなければ、 NULL を返します。

使用例

void *p; 
p = contigmalloc(8192, M_DEVBUF, M_ZERO, 0, (1L << 22), 
    32 * 1024, 1024 * 1024);

物理アドレス 0 と 4194303 の間 (0 と 4194303 を含んで) に存在し、 32K 境界に整列され、1M のアドレス境界に交差しなくて、 8192 バイトの 0 クリアたされたメモリを要求しています。

診断

contigmalloc() 関数は、 size が 0 である、または alignment または boundary が 2 冪乗でないならパニックします。

関連項目

malloc(9), memguard(9)
July 19, 2007 FreeBSD