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

名称

kobjFreeBSD のカーネルオブジェクトシステム

書式

#include < sys/param.h>
#include < sys/kobj.h>

void
kobj_class_compile( kobj_class_t cls);

void
kobj_class_compile_static( kobj_class_t cls, kobj_ops_t ops);

void
kobj_class_free( kobj_class_t cls);

kobj_t
kobj_create( kobj_class_t cls, struct malloc_type *mtype, int mflags);

void
kobj_init( kobj_t obj, kobj_class_t cls);

void
kobj_init_static( kobj_t obj, kobj_class_t cls);

void
kobj_delete( kobj_t obj, struct malloc_type *mtype);

DEFINE_CLASS( name, kobj_method_t *methods, size_t size);

解説

カーネルオブジェクトシステムは、 FreeBSD カーネルでオブジェクト指向プログラミングシステムを実装します。システムは、メソッドのセットの説明であるインタフェース、それらのインタフェースから特定のメソッドを実装する関数のリストであるクラス、および、クラスをメモリの構造体に結合するオブジェクトのコンセプトに基づいています。

メソッドは新しいインタフェースとクラスが実行時にシステムに導入されることを可能とするように設計されたダイナミックメソッドディスパッチアルゴリズムを使用して呼び出されます。メソッドディスパッチアルゴリズムは、速くて頑丈に設計されており、直接関数呼び出しよりわずかにだけ高価で、カーネルオブジェクトを性能クリティカルなアルゴリズムに適合するようににします。

カーネルオブジェクトへの適切な用途はある種のポリモフィズム (すなわち、一様に取り扱うことができる多くの異なったオブジェクト) を必要とする任意のアルゴリズムですオブジェクトの共通の振る舞いは、適切なインタフェースによって記述され、それぞれの異なったタイプのオブジェクトは適当なクラスによって実装されます。

カーネルオブジェクトを作成する最も簡単な方法は、適切なクラス、malloc タイプ、とフラグ (malloc タイプとフラグの説明に関しては malloc(9) を参照してください) で kobj_create() を呼び出すことです。これは、クラスによって指定されたオブジェクトサイズに基づくオブジェクトのためにメモリを割り付けて、そのメモリを 0 クリアしてクラスのメソッドディスパッチテーブルへのポインタをインストールすることによって初期化します。このように作成されたオブジェクトは kobj_delete() を呼び出すことによって、解放されるべきです。

それら自体でメモリの割り付けを管理するようなクライアントは、それを実装するオブジェクトとクラスのためのメモリへのポインタで kobj_init() または kobj_init_static() を呼び出すべきです。また、オブジェクトのためにクラスを変更するために kobj_init() と kobj_init_static() を使用することも可能です。クラスがオブジェクトのレイアウトについて一致しなければならないとき、これは慎重に行われるべきです。デバイスフレームワークはドライバをデバイスに関連づけるこの機能を使用します。

関数 kobj_class_compile(), kobj_class_compile_static() と kobj_class_free() は、メソッドのディスパッチを効率的にするようにクラス記述を処理するために使用されます。それが初めて使用されるときクラスが自動的にコンパイルされるので、クライアントは、通常、これらと呼び出す必要はありません。 malloc(9)mutex(9) が初期化される前にクラスが使用されているなら、 kobj_class_compile_static() は、クラスが任意のオブジェクトを初期化するため使用される前に、クラスと静的に割り付けられた kobj_ops 構造体へのポインタで呼び出されるべきです。また、その場合には、 kobj_init_static() は、 kobj_init() の代わりに使用されるべきです。

クラスを定義するためには、最初に、 kobj_method_t の単純な配列を定義します。クラスを実行する各メソッドは、 (そのインタフェースを含んでいる) メソッドの名前とそれを実装する関数へのポインタをを取るマクロ KOBJMETHOD() を使用してテーブルに入れられるべきです。テーブルは 2 つの 0 で終了されるべきです。そして、マクロ DEFINE_CLASS() は kobj_class_t 構造体を初期化するために使用することができます。 DEFINE_CLASS() へのサイズ引数は、各オブジェクトのために割り付けられるべきメモリがどのくらいであるかを指定します。

歴史

このインタフェースのための概念のいくつかは FreeBSD 3.0 のアルファポートに使用され、 FreeBSD 4.0 でより広範囲に使用されるデバイスフレームワークで登場しました。

作者

このマニュアルページは、 Doug Rabson によって書かれました。
November 14, 2011 FreeBSD