法楽日記

デジタル散策記&マインド探訪記

FreeBSD 11.1R: 通信 domain の初期化

FreeBSD 11.1R で各通信 domain を定義するマクロ DOMAIN_SET() と VNET_DOMAIN_SET() は、マクロ SYSINIT() を利用しています。

SYSINIT() は、カーネル起動時に初期化が必要な subsystem を登録するためのマクロです。SYSINIT() で定義された sysinit 構造体はリンク時に1箇所に集められて、カーネル内からは sysinit 構造体の配列として見えるようです。先頭アドレスは SET_BEGIN(sysinit_set)、終了アドレスは SET_LIMIT(sysinit_set) で取り出せるようです。

SYSINIT() で定義された subsystem の配列は、カーネル起動時に関数 mi_startup() の中でバブル・ソートされた後、順に呼び出されます。

なお、DOMAIN_SET() と VNET_DOMAIN_SET() は sys/sys/domain.h で、SYSINIT() は sys/sys/kernel.h で、SET_BEGIN() と SET_LIMIT() は sys/sys/linker_set.h で、mi_startup() は sys/kern/init_main.c で、それぞれ定義されています。