# SOME DESCRIPTIVE TITLE # Copyright (C) YEAR The FreeBSD Project # This file is distributed under the same license as the FreeBSD Documentation package. # Vladlen Popolitov , 2025, 2026. msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" "POT-Creation-Date: 2025-05-01 19:56-0300\n" "PO-Revision-Date: 2026-03-04 20:01+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" #. type: Title = #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:1 #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:14 #, no-wrap msgid "The SYSINIT Framework" msgstr "Фреймворк SYSINIT" #. type: YAML Front Matter: title #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:1 #, no-wrap msgid "Chapter 5. The SYSINIT Framework" msgstr "Глава 5. Фреймворк SYSINIT" #. type: Plain text #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:52 msgid "" "SYSINIT is the framework for a generic call sort and dispatch mechanism. " "FreeBSD currently uses it for the dynamic initialization of the kernel. " "SYSINIT allows FreeBSD's kernel subsystems to be reordered, and added, " "removed, and replaced at kernel link time when the kernel or one of its " "modules is loaded without having to edit a statically ordered initialization " "routing and recompile the kernel. This system also allows kernel modules, " "currently called _KLD's_, to be separately compiled, linked, and initialized " "at boot time and loaded even later while the system is already running. This " "is accomplished using the \"kernel linker\" and \"linker sets\"." msgstr "" "SYSINIT — это фреймворк для общего механизма сортировки и диспетчеризации " "вызовов. В настоящее время FreeBSD использует его для динамической " "инициализации ядра. SYSINIT позволяет изменять порядок, добавлять, удалять и " "заменять подсистемы ядра FreeBSD во время линковки ядра при загрузке ядра " "или его модулей, без необходимости редактировать статически упорядоченные " "маршруты инициализации и перекомпилировать ядро. Эта система также позволяет " "модулям ядра (в настоящее время называемым _KLD_) компилироваться, " "линковаться и инициализироваться отдельно во время загрузки, а также " "загружаться позже, когда система уже работает. Это достигается с помощью «" "компоновщика ядра» (kernel linker) и «наборов компоновщика» (linker sets)." #. type: Title == #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:54 #, no-wrap msgid "Terminology" msgstr "Терминология" #. type: Labeled list #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:56 #, no-wrap msgid "Linker Set" msgstr "Набор компоновщика (Linker Set)" #. type: Plain text #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:58 msgid "" "A linker technique in which the linker gathers statically declared data " "throughout a program's source files into a single contiguously addressable " "unit of data." msgstr "" "Техника компоновщика, при которой компоновщик собирает статически " "объявленные данные из всех исходных файлов программы в единый непрерывно " "адресуемый блок данных." #. type: Title == #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:60 #, no-wrap msgid "SYSINIT Operation" msgstr "Работа механизма SYSINIT" #. type: Plain text #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:63 msgid "" "SYSINIT relies on the ability of the linker to take static data declared at " "multiple locations throughout a program's source and group it together as a " "single contiguous chunk of data. This linker technique is called a \"linker " "set\". SYSINIT uses two linker sets to maintain two data sets containing " "each consumer's call order, function, and a pointer to the data to pass to " "that function." msgstr "" "SYSINIT полагается на способность компоновщика объединять статические " "данные, объявленные в нескольких местах исходного кода программы, в единый " "непрерывный блок данных. Этот метод компоновщика называется \"набором " "компоновщика\" (linker set). SYSINIT использует два набора компоновщика для " "поддержки двух наборов данных, содержащих порядок вызова, функцию и " "указатель на данные, передаваемые этой функции для каждого члена этих " "наборов данных." #. type: Plain text #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:65 msgid "" "SYSINIT uses two priorities when ordering the functions for execution. The " "first priority is a subsystem ID giving an overall order for SYSINIT's " "dispatch of functions. Current predeclared ID's are in [.filename]## in the enum list `sysinit_sub_id`. The second priority used is an " "element order within the subsystem. Current predeclared subsystem element " "orders are in [.filename]## in the enum list " "`sysinit_elem_order`." msgstr "" "SYSINIT использует два приоритета для упорядочивания функций при выполнении. " "Первый приоритет — это идентификатор подсистемы, задающий общий порядок " "вызова функций SYSINIT. Предварительно объявленные идентификаторы находятся " "в [.filename]## в перечислении `sysinit_sub_id`. Второй " "используемый приоритет — это порядок элементов внутри подсистемы. " "Предварительно объявленные порядки элементов подсистемы находятся в [." "filename]## в перечислении `sysinit_elem_order`." #. type: Plain text #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:67 msgid "" "There are currently two uses for SYSINIT. Function dispatch at system " "startup and kernel module loads, and function dispatch at system shutdown " "and kernel module unload. Kernel subsystems often use system startup " "SYSINIT's to initialize data structures, for example the process scheduling " "subsystem uses a SYSINIT to initialize the run queue data structure. Device " "drivers should avoid using `SYSINIT()` directly. Instead drivers for real " "devices that are part of a bus structure should use `DRIVER_MODULE()` to " "provide a function that detects the device and, if it is present, " "initializes the device. It will do a few things specific to devices and then " "call `SYSINIT()` itself. For pseudo-devices, which are not part of a bus " "structure, use `DEV_MODULE()`." msgstr "" "В настоящее время существует два варианта использования `SYSINIT`: вызов " "функций при загрузке системы и загрузке модулей ядра, а также вызов функций " "при завершении работы системы и выгрузке модулей ядра. Подсистемы ядра часто " "используют `SYSINIT` при старте системы для инициализации структур данных. " "Например, подсистема планирования процессов использует `SYSINIT` для " "инициализации структуры данных очереди выполнения. Драйверы устройств должны " "избегать прямого использования `SYSINIT()`. Вместо этого драйверы реальных " "устройств, входящих в структуру шины, должны использовать `DRIVER_MODULE()`, " "который предоставляет функцию для обнаружения устройства и, если оно " "присутствует, его инициализации. Этот макрос выполняет несколько действий, " "специфичных для устройств, а затем вызывает `SYSINIT()` самостоятельно. Для " "псевдоустройств, которые не входят в структуру шины, следует использовать " "`DEV_MODULE()`." #. type: Title == #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:69 #, no-wrap msgid "Using SYSINIT" msgstr "Использование SYSINIT" #. type: Title === #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:71 #, no-wrap msgid "Interface" msgstr "Интерфейс" #. type: Title ==== #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:73 #, no-wrap msgid "Headers" msgstr "Заголовки" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:78 #, no-wrap msgid "\n" msgstr "\n" #. type: Title ==== #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:80 #, no-wrap msgid "Macros" msgstr "Макросы" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:86 #, no-wrap msgid "" "SYSINIT(uniquifier, subsystem, order, func, ident)\n" "SYSUNINIT(uniquifier, subsystem, order, func, ident)\n" msgstr "" "SYSINIT(uniquifier, subsystem, order, func, ident)\n" "SYSUNINIT(uniquifier, subsystem, order, func, ident)\n" #. type: Title === #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:88 #, no-wrap msgid "Startup" msgstr "Запуск" #. type: Plain text #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:91 msgid "" "The `SYSINIT()` macro creates the necessary SYSINIT data in SYSINIT's " "startup data set for SYSINIT to sort and dispatch a function at system " "startup and module load. `SYSINIT()` takes a uniquifier that SYSINIT uses to " "identify the particular function dispatch data, the subsystem order, the " "subsystem element order, the function to call, and the data to pass the " "function. All functions must take a constant pointer argument." msgstr "" "Макрос `SYSINIT()` создает необходимые данные SYSINIT в наборе данных " "инициализации системы, чтобы SYSINIT мог отсортировать и выполнить функцию " "при запуске системы и загрузке модуля. `SYSINIT()` принимает уникальный " "идентификатор, который SYSINIT использует для идентификации конкретных " "данных вызова функции, порядок подсистемы, порядок элемента подсистемы, " "функцию для вызова и данные для передачи в функцию. Все функции должны " "принимать аргумент в виде константного указателя." #. type: Block title #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:92 #, no-wrap msgid "Example of a `SYSINIT()`" msgstr "Пример `SYSINIT()`" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:98 #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:148 #, no-wrap msgid "#include \n" msgstr "#include \n" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:104 #, no-wrap msgid "" "void foo_null(void *unused)\n" "{\n" " foo_doo();\n" "}\n" "SYSINIT(foo, SI_SUB_FOO, SI_ORDER_FOO, foo_null, NULL);\n" msgstr "" "void foo_null(void *unused)\n" "{\n" " foo_doo();\n" "}\n" "SYSINIT(foo, SI_SUB_FOO, SI_ORDER_FOO, foo_null, NULL);\n" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:108 #, no-wrap msgid "" "struct foo foo_voodoo = {\n" " FOO_VOODOO;\n" "}\n" msgstr "" "struct foo foo_voodoo = {\n" " FOO_VOODOO;\n" "}\n" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:115 #, no-wrap msgid "" "void foo_arg(void *vdata)\n" "{\n" " struct foo *foo = (struct foo *)vdata;\n" " foo_data(foo);\n" "}\n" "SYSINIT(bar, SI_SUB_FOO, SI_ORDER_FOO, foo_arg, &foo_voodoo);\n" msgstr "" "void foo_arg(void *vdata)\n" "{\n" " struct foo *foo = (struct foo *)vdata;\n" " foo_data(foo);\n" "}\n" "SYSINIT(bar, SI_SUB_FOO, SI_ORDER_FOO, foo_arg, &foo_voodoo);\n" #. type: delimited block = 4 #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:119 msgid "" "Note that `SI_SUB_FOO` and `SI_ORDER_FOO` need to be in the `sysinit_sub_id` " "and `sysinit_elem_order` enum's as mentioned above. Either use existing ones " "or add your own to the enum's. You can also use math for fine-tuning the " "order a SYSINIT will run in. This example shows a SYSINIT that needs to be " "run just barely before the SYSINIT's that handle tuning kernel parameters." msgstr "" "Обратите внимание, что `SI_SUB_FOO` и `SI_ORDER_FOO` должны быть в " "перечислениях `sysinit_sub_id` и `sysinit_elem_order`, как упоминалось выше. " "Можно использовать существующие значения или добавить свои в эти " "перечисления. Также можно использовать математические операции для точной " "настройки порядка выполнения SYSINIT. В этом примере показан SYSINIT, " "который должен выполняться непосредственно перед SYSINIT, обрабатывающими " "настройку параметров ядра." #. type: Block title #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:120 #, no-wrap msgid "Example of Adjusting `SYSINIT()` Order" msgstr "Пример настройки порядка `SYSINIT()`" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:128 #, no-wrap msgid "" "static void\n" "mptable_register(void *dummy __unused)\n" "{\n" msgstr "" "static void\n" "mptable_register(void *dummy __unused)\n" "{\n" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:131 #, no-wrap msgid "" "\tapic_register_enumerator(&mptable_enumerator);\n" "}\n" msgstr "" "\tapic_register_enumerator(&mptable_enumerator);\n" "}\n" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:134 #, no-wrap msgid "" "SYSINIT(mptable_register, SI_SUB_TUNABLES - 1, SI_ORDER_FIRST,\n" " mptable_register, NULL);\n" msgstr "" "SYSINIT(mptable_register, SI_SUB_TUNABLES - 1, SI_ORDER_FIRST,\n" " mptable_register, NULL);\n" #. type: Title === #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:138 #, no-wrap msgid "Shutdown" msgstr "Выключение системы" #. type: delimited block = 4 #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:141 msgid "" "The `SYSUNINIT()` macro behaves similarly to the `SYSINIT()` macro except " "that it adds the SYSINIT data to SYSINIT's shutdown data set." msgstr "" "Макрос `SYSUNINIT()` ведёт себя аналогично макросу `SYSINIT()`, за " "исключением того, что добавляет данные SYSINIT в набор данных завершения " "работы SYSINIT." #. type: Block title #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:142 #, no-wrap msgid "Example of a `SYSUNINIT()`" msgstr "Пример `SYSUNINIT()`" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:154 #, no-wrap msgid "" "void foo_cleanup(void *unused)\n" "{\n" " foo_kill();\n" "}\n" "SYSUNINIT(foobar, SI_SUB_FOO, SI_ORDER_FOO, foo_cleanup, NULL);\n" msgstr "" "void foo_cleanup(void *unused)\n" "{\n" " foo_kill();\n" "}\n" "SYSUNINIT(foobar, SI_SUB_FOO, SI_ORDER_FOO, foo_cleanup, NULL);\n" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:158 #, no-wrap msgid "" "struct foo_stack foo_stack = {\n" " FOO_STACK_VOODOO;\n" "}\n" msgstr "" "struct foo_stack foo_stack = {\n" " FOO_STACK_VOODOO;\n" "}\n" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:163 #, no-wrap msgid "" "void foo_flush(void *vdata)\n" "{\n" "}\n" "SYSUNINIT(barfoo, SI_SUB_FOO, SI_ORDER_FOO, foo_flush, &foo_stack);\n" msgstr "" "void foo_flush(void *vdata)\n" "{\n" "}\n" "SYSUNINIT(barfoo, SI_SUB_FOO, SI_ORDER_FOO, foo_flush, &foo_stack);\n"