5.3. 使用SYSINIT

5.3.1. 接口

5.3.1.1. 头文件

<sys/kernel.h>

5.3.1.2. 宏

SYSINIT(uniquifier, subsystem, order, func, ident)SYSUNINIT(uniquifier, subsystem, order, func, ident)

5.3.2. 启动

SYSINIT()在SYSINIT启动数据集合中 建立一个SYSINIT数据项,以便SYSINIT在系统启动或模块加载时排序 并执行其中的函数。SYSINIT()有一个参数uniquifier, SYSINIT用它来标识数据项,随后是子系统顺序号、子系统元素顺序号、 待调用函数、传递给函数的数据。所有的函数必须有一个恒量指针参数。

例 5.1. SYSINIT()的例子
#include <sys/kernel.h>void foo_null(void *unused){ foo_doo();}SYSINIT(foo, SI_SUB_FOO, SI_ORDER_FOO, foo_null, NULL);struct foo foo_voodoo = { FOO_VOODOO;}void foo_arg(void *vdata){ struct foo *foo = (struct foo *)vdata; foo_data(foo);}SYSINIT(bar, SI_SUB_FOO, SI_ORDER_FOO, foo_arg, &foo_voodoo);

注意,SI_SUB_FOOSI_ORDER_FOO 应当分别在上面提到的枚举sysinit_sub_idsysinit_elem_order之中。既可以使用已有的枚举项, 也可以将自己的枚举项添加到这两个枚举的定义之中。 你可以使用数学表达式微调SYSINIT的执行顺序。 以下的例子示例了一个需要刚好要在内核参数调整的SYSINIT之前执行的SYSINIT。

例 5.2. 调整SYSINIT()顺序的例子
static voidmptable_register(void *dummy __unused){ apic_register_enumerator(&mptable_enumerator);}SYSINIT(mptable_register, SI_SUB_TUNABLES - 1, SI_ORDER_FIRST, mptable_register, NULL);

5.3.3. 析构

SYSUNINIT()的行为与SYSINIT()的相当, 只是它将数据项填加至SYSINIT的析构数据集合。

例 5.3. SYSUNINIT()的例子
#include <sys/kernel.h>void foo_cleanup(void *unused){ foo_kill();}SYSUNINIT(foobar, SI_SUB_FOO, SI_ORDER_FOO, foo_cleanup, NULL);struct foo_stack foo_stack = { FOO_STACK_VOODOO;}void foo_flush(void *vdata){}SYSUNINIT(barfoo, SI_SUB_FOO, SI_ORDER_FOO, foo_flush, &foo_stack);

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.