SYSINIT(9) | FreeBSD Kernel Developer's Manual | SYSINIT(9) |
名称
SYSINIT, SYSUNINIT — 動的なカーネル初期化のためのフレームワーク書式
#include < sys/param.h>#include < sys/kernel.h>
SYSINIT( uniquifier, enum sysinit_sub_id subsystem, enum sysinit_elem_order order, sysinit_cfunc_t func, const void *ident);
SYSUNINIT( uniquifier, enum sysinit_sub_id subsystem, enum sysinit_elem_order order, sysinit_cfunc_t func, const void *ident);
解説
SYSINIT は、初期化と分解 (teardown) ルーチンの実行のスケジュールを行うためのメカニズムです。これは、明白なメタデータの順序付けの追加のある init と fini ルーチンと同様です。カーネルモジュール (KLD) と同様にカーネルのサブシステムの初期化の実行時の順序付けを可能にします。SYSINIT() マクロは、 struct sysinit を作成して、起動時のリンカセットに、それを格納します。サブシステム識別子定数 ( SI_SUB_*) と同様の struct sysinit タイプと定数 ( SI_ORDER_*) を順序付ける初期化は、 < sys/kernel.h> に定義されています:
struct sysinit { enum sysinit_sub_id subsystem; /* サブシステム識別子 */ enum sysinit_elem_order order; /* サブシステム中の初期順序 */ sysinit_cfunc_t func; /* 関数 */ const void *udata; /* マルチプレクサ/引数 */ };
SYSINIT() マクロは、特定の関数ディスパッチデータを識別するための uniquifier、起動時インタフェースの subsystem タイプ、サブシステム中の初期化のサブシステム要素 order (順序)、呼び出す func 関数、と関数に渡される ident で指定されたデータを引数を取ります。
SYSUNINIT() マクロは、シャットダウンリンカセットにデータを追加することを除いて、 SYSINIT() マクロと同様に振る舞います。
カーネルのための起動時リンカセットは、初期化ルーチンのソートされたリストを構築するるためにブートの間にスキャンされます。次に、初期化ルーチンは、ソートされた順序で実行されます。 subsystem は、主キーとして使用され、昇順にソートされます。 order (順序) は、二次キーとして使用され、昇順にソートされます。同じ subsystem と order がある 2 つのルーチンの相対的な順序は、未定義です。
ブートローダによってカーネルと共にロードされるモジュールのための起動時リンカセットは、 SI_SUB_KLD サブシステムの初期化の間にスキャンされます。これらのモジュールの初期化ルーチンは、ソートされ、カーネルの起動時ルーチンのリストにマージされ、カーネルの初期化ルーチンとともにブートの間に実行されます。これには、 SI_SUB_KLD より早くスケジュールされるカーネルモジュールのあらゆる初期化ルーチンは、ブートの間に SI_SUB_KLD の後まで実行されないという影響があることに注意してください。
kldload(2) を通して、実行時にロードされるカーネルモジュールのための起動時リンカセットは、モジュールがロードされるとき、スキャンされ、ソートされ、実行されます。
カーネルモジュールのためのシャットダウンリンカセットは、モジュールがアンロードされるとき、スキャンされ、ソートされ、実行されます。分解 (teardown) ルーチンは、初期化ルーチンの逆の順序でソートされます。カーネルのルーチンとあらゆるロードされたモジュールは、シャットダウンの間に実行され ません。
使用例
次の例は、ブートの間に、版権情報を表示する SYSINIT を示しています:
static void print_caddr_t(void *data) { printf("%s", (char *)data); } SYSINIT(announce, SI_SUB_COPYRIGHT, SI_ORDER_FIRST, print_caddr_t, copyright);
歴史
SYSINIT フレームワークは、 FreeBSD 2.2 ではじめて登場しました。作者
SYSINIT フレームワークは、 <terry@FreeBSD.org>によって書かれました。このマニュアルページは、
<hmp@FreeBSD.org>によって書かれました。December 1, 2010 | FreeBSD |