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 バイトの連続する物理メモリを割り付けます。成功すれば、割り付けは、物理アドレス low と high の間に存在します。返されたポインタは、カーネル仮想アドレス (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 冪乗でないならパニックします。July 19, 2007 | FreeBSD |