EN JA
SYSINIT(9)
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 (順序) は、二次キーとして使用され、昇順にソートされます。同じ subsystemorder がある 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 フレームワークは、 Terrence Lambert <terry@FreeBSD.org>によって書かれました。

このマニュアルページは、 Hiten Pandya <hmp@FreeBSD.org>によって書かれました。

December 1, 2010 FreeBSD