5.3. Использование SYSINIT

5.3.1. Интерфейс

5.3.1.2. Макросы

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

5.3.2. Загрузка

Макрос SYSINIT() создает необходимые данные SYSINIT в начальном наборе данных SYSINIT для того, чтобы SYSINIT сортировал и диспетчеризировал функцию при запуске системы и загрузке модуля. SYSINIT() принимает уникальный идентификатор, который используется в 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_FOO и SI_ORDER_FOO должны присутствовать в перечислениях sysinit_sub_id и sysinit_elem_order, как упомянуто выше. Либо используйте существующие, либо добавляйте свои в перечисления. Вы также можете использовать математику для более тонкого настраивания порядка, который будет проходить SYSINIT. Ниже показан пример SYSINIT, который должен быть запущен перед действиями SYSINIT, настраивающими параметры ядра.

Пример 5-2. Пример корректирования порядка SYSINIT()

static void
mptable_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 к набору данных закрытия 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>.
По вопросам, связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.