Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-doc
Path: blob/main/documentation/content/ru/books/arch-handbook/sysinit/_index.po
18098 views
# SOME DESCRIPTIVE TITLE
# Copyright (C) YEAR The FreeBSD Project
# This file is distributed under the same license as the FreeBSD Documentation package.
# Vladlen Popolitov <[email protected]>, 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-04-05 04:45+0000\n"
"Last-Translator: Vladlen Popolitov <[email protected]>\n"
"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
"documentation/booksarch-handbooksysinit_index/ru/>\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]#<sys/"
"kernel.h># 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]#<sys/kernel.h># in the enum list "
"`sysinit_elem_order`."
msgstr ""
"SYSINIT использует два приоритета для упорядочивания функций при выполнении. "
"Первый приоритет — это идентификатор подсистемы, задающий общий порядок "
"вызова функций SYSINIT. Предварительно объявленные идентификаторы находятся "
"в [.filename]#<sys/kernel.h># в перечислении `sysinit_sub_id`. Второй "
"используемый приоритет — это порядок элементов внутри подсистемы. "
"Предварительно объявленные порядки элементов подсистемы находятся в [."
"filename]#<sys/kernel.h># в перечислении `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 "<sys/kernel.h>\n"
msgstr "<sys/kernel.h>\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 <sys/kernel.h>\n"
msgstr "#include <sys/kernel.h>\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"