aboutsummaryrefslogtreecommitdiff
path: root/documentation/content/ru/books/arch-handbook/sysinit
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/content/ru/books/arch-handbook/sysinit')
-rw-r--r--documentation/content/ru/books/arch-handbook/sysinit/_index.adoc165
-rw-r--r--documentation/content/ru/books/arch-handbook/sysinit/_index.po393
2 files changed, 558 insertions, 0 deletions
diff --git a/documentation/content/ru/books/arch-handbook/sysinit/_index.adoc b/documentation/content/ru/books/arch-handbook/sysinit/_index.adoc
new file mode 100644
index 0000000000..b108a6d571
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/sysinit/_index.adoc
@@ -0,0 +1,165 @@
+---
+description: 'Фреймворк SYSINIT'
+next: books/arch-handbook/mac
+params:
+ path: /books/arch-handbook/sysinit/
+prev: books/arch-handbook/jail
+showBookMenu: 'true'
+tags: ["SYSINIT", "framework", "Terminology"]
+title: 'Глава 5. Фреймворк SYSINIT'
+weight: 6
+---
+
+[[sysinit]]
+= Фреймворк SYSINIT
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 5
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+SYSINIT — это фреймворк для общего механизма сортировки и диспетчеризации вызовов. В настоящее время FreeBSD использует его для динамической инициализации ядра. SYSINIT позволяет изменять порядок, добавлять, удалять и заменять подсистемы ядра FreeBSD во время линковки ядра при загрузке ядра или его модулей, без необходимости редактировать статически упорядоченные маршруты инициализации и перекомпилировать ядро. Эта система также позволяет модулям ядра (в настоящее время называемым _KLD_) компилироваться, линковаться и инициализироваться отдельно во время загрузки, а также загружаться позже, когда система уже работает. Это достигается с помощью «компоновщика ядра» (kernel linker) и «наборов компоновщика» (linker sets).
+
+[[sysinit-term]]
+== Терминология
+
+Набор компоновщика (Linker Set)::
+Техника компоновщика, при которой компоновщик собирает статически объявленные данные из всех исходных файлов программы в единый непрерывно адресуемый блок данных.
+
+[[sysinit-operation]]
+== Работа механизма SYSINIT
+
+SYSINIT полагается на способность компоновщика объединять статические данные, объявленные в нескольких местах исходного кода программы, в единый непрерывный блок данных. Этот метод компоновщика называется "набором компоновщика" (linker set). SYSINIT использует два набора компоновщика для поддержки двух наборов данных, содержащих порядок вызова, функцию и указатель на данные, передаваемые этой функции для каждого члена этих наборов данных.
+
+SYSINIT использует два приоритета для упорядочивания функций при выполнении. Первый приоритет — это идентификатор подсистемы, задающий общий порядок вызова функций SYSINIT. Предварительно объявленные идентификаторы находятся в [.filename]#<sys/kernel.h># в перечислении `sysinit_sub_id`. Второй используемый приоритет — это порядок элементов внутри подсистемы. Предварительно объявленные порядки элементов подсистемы находятся в [.filename]#<sys/kernel.h># в перечислении `sysinit_elem_order`.
+
+В настоящее время существует два варианта использования `SYSINIT`: вызов функций при загрузке системы и загрузке модулей ядра, а также вызов функций при завершении работы системы и выгрузке модулей ядра. Подсистемы ядра часто используют `SYSINIT` при старте системы для инициализации структур данных. Например, подсистема планирования процессов использует `SYSINIT` для инициализации структуры данных очереди выполнения. Драйверы устройств должны избегать прямого использования `SYSINIT()`. Вместо этого драйверы реальных устройств, входящих в структуру шины, должны использовать `DRIVER_MODULE()`, который предоставляет функцию для обнаружения устройства и, если оно присутствует, его инициализации. Этот макрос выполняет несколько действий, специфичных для устройств, а затем вызывает `SYSINIT()` самостоятельно. Для псевдоустройств, которые не входят в структуру шины, следует использовать `DEV_MODULE()`.
+
+[[sysinit-using]]
+== Использование SYSINIT
+
+=== Интерфейс
+
+==== Заголовки
+
+[.programlisting]
+....
+<sys/kernel.h>
+....
+
+==== Макросы
+
+[.programlisting]
+....
+SYSINIT(uniquifier, subsystem, order, func, ident)
+SYSUNINIT(uniquifier, subsystem, order, func, ident)
+....
+
+=== Запуск
+
+Макрос `SYSINIT()` создает необходимые данные SYSINIT в наборе данных инициализации системы, чтобы SYSINIT мог отсортировать и выполнить функцию при запуске системы и загрузке модуля. `SYSINIT()` принимает уникальный идентификатор, который SYSINIT использует для идентификации конкретных данных вызова функции, порядок подсистемы, порядок элемента подсистемы, функцию для вызова и данные для передачи в функцию. Все функции должны принимать аргумент в виде константного указателя.
+
+.Пример `SYSINIT()`
+[example]
+====
+[.programlisting]
+....
+#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, обрабатывающими настройку параметров ядра.
+
+.Пример настройки порядка `SYSINIT()`
+[example]
+====
+[.programlisting]
+....
+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);
+....
+
+====
+
+=== Выключение системы
+
+Макрос `SYSUNINIT()` ведет себя аналогично макросу `SYSINIT()`, за исключением того, что добавляет данные SYSINIT в набор данных завершения работы SYSINIT.
+
+.Пример `SYSUNINIT()`
+[example]
+====
+[.programlisting]
+....
+#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);
+....
+
+====
diff --git a/documentation/content/ru/books/arch-handbook/sysinit/_index.po b/documentation/content/ru/books/arch-handbook/sysinit/_index.po
new file mode 100644
index 0000000000..c7ff0782c8
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/sysinit/_index.po
@@ -0,0 +1,393 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-05-01 19:56-0300\n"
+"PO-Revision-Date: 2025-07-02 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\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"