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

名称

vmem汎用リソースアロケータ

書式

#include < sys/vmem.h>

vmem_t *
vmem_create( const char *name, vmem_addr_t base, vmem_size_t size, vmem_size_t quantum, vmem_size_t qcache_max, int flags);

int
vmem_add( vmem_t *vm, vmem_addr_t addr, vmem_size_t size, int flags);

int
vmem_xalloc( vmem_t *vm, const vmem_size_t size, vmem_size_t align, const vmem_size_t phase, const vmem_size_t nocross, const vmem_addr_t minaddr, const vmem_addr_t maxaddr, int flags, vmem_addr_t *addrp);

void
vmem_xfree( vmem_t *vm, vmem_addr_t addr, vmem_size_t size);

int
vmem_alloc( vmem_t *vm, vmem_size_t size, int flags, vmem_addr_t *addrp);

void
vmem_free( vmem_t *vm, vmem_addr_t addr, vmem_size_t size);

void
vmem_destroy( vmem_t *vm);

解説

vmem は、汎用のリソースアロケータです。その名前にもかかわらず、それは、仮想メモリではなく任意のリソースのために使用することができます。

vmem_create() は、新しい vmem 領域を作成します。

name
vmem を記述する文字列。
base
最初のスパン (span) の開始アドレス。最初のスパンが必要でないなら、 0 を渡します。
size
最初のスパンのサイズ。最初のスパンが必要でないなら、 0 を渡します。
quantum
割り付けの最小の単位。
qcache_max
定量 (quantum) キャッシュによって役に立つことができる割り付けの最大のサイズ。それは、単なるヒントで無視することができます。
flags
malloc(9) のウェートフラグと vmem 割り付け戦略フラグの組み合わせは、次の通りです:
M_FIRSTFIT
割り付け性能を選びます。
M_BESTFIT
空間効率を選びます。

vmem_add() は、 addr で始まるサイズ size のスパンを領域に追加します。成功すれば、0 を返し、失敗すれば、 ENOMEM を返します。 flags は、 malloc(9) ウェートフラグです。

vmem_xalloc() は、領域からリソースを割り付けます。

vm
割り付ける領域。
size
割り付けのサイズを指定します。
align
0 であるなら、割り付けの整列に関して気にしません。そうでなければ、 align で整列された境界からオフセット phase で始まるリソースのセグメントを要求します。
phase
align の記述に関して参照してください。 align が 0 であるなら、 phase は 0 であるべきです。そうでなければ、 phase は、 align より小さくあるべきです。
nocross
nocross で整列された境界と交差しないリソースを要求します。
minaddr
割り付けることができる最小のアドレス、または呼び出し側が気にしないなら、 VMEM_ADDR_MIN を指定します。
maxaddr
割り付けることができる最大のアドレス、または呼び出し側が気にしないなら、 VMEM_ADDR_MAX を指定します。
flags
割り付け戦略のビット単位の和 (OR) と malloc(9) のウェートフラグ。割り付け戦略は、 M_FIRSTFITM_BESTFIT の 1 つです。
addrp
成功すれば、 addrpNULL でないなら、 vmem_xalloc() は、割り付けられたスパンの開始アドレスでそれを上書きします。

vmem_xfree() は、領域に vmem_xalloc() によって割り付けられたリソースを解放します。

vm
解放する領域。
addr
解放されるリソース。それは、 vmem_xalloc() によって返されたものでなければなりません。特に、それは、 vmem_alloc() からのものではあってはなりません。そうでなければ、その振る舞いは、未定義です。
size
解放されるリソースのサイズ。それは、 vmem_xalloc() のために使用される size 引数と同じでなければなりません。

vmem_alloc() は、領域からリソースを割り付けます。

vm
割り付ける領域。
size
割り付けのサイズを指定します。
flags
vmem の割り付け戦略フラグ (上記参照) のビット単位の和 (OR) と malloc(9) のスリープフラグ。
addrp
成功すれば、 addrpNULL でないなら、 vmem_alloc() は、割り付けられたスパンの開始アドレスでそれを上書きします。

vmem_free() は、領域に vmem_alloc() によって割り付けられたリソースを解放します。

vm
解放する領域。
addr
解放されるリソース。それは、 vmem_alloc() によって返されたものでなければなりません。特に、それは、 vmem_xalloc() からのものではあってはなりません。そうでなければ、その振る舞いは、未定義です。
size
解放されるリソースのサイズ。それは、 vmem_alloc() のために使用される size 引数と同じでなければなりません。

vmem_destroy() は、vmem 領域を破壊します。

vm
破壊される vmem 領域。呼び出し側は、誰もそれをこれ以上使用しないことを保証するべきです。

戻り値

vmem_create() は、新しく割り付けられた vmem_t へのポインタを返します。そうでなければ、それは、 NULL を返します。

成功すれば、 vmem_xalloc() と vmem_alloc() は、0 を返します。そうでなければ、 ENOMEM が返されます。

コード参照

vmem サブシステムは、ファイル sys/kern/subr_vmem.c 内に実装されています。

関連項目

malloc(9) Jeff Bonwick and Jonathan Adams, Magazines and Vmem: Extending the Slab Allocator to Many CPUs and Arbitrary Resources, 2001 USENIX Annual Technical Conference, 2001.

歴史

vmem アロケータは、最初に NetBSD で実装されました。それは、 FreeBSD 10.0 で導入されました。

作者

vmem のオリジナルの実装は、 YAMAMOTO Takashi によって書かれました。 FreeBSD の移植は、 Jeff Roberson によって行なわれました。

バグ

vmem は、 malloc(9) に依存しているので、システムブートストラップの初期の間のように使用することができません。
July 12, 2013 FreeBSD