diff options
Diffstat (limited to 'documentation/content/ru/books/arch-handbook/sysinit')
| -rw-r--r-- | documentation/content/ru/books/arch-handbook/sysinit/_index.adoc | 165 | ||||
| -rw-r--r-- | documentation/content/ru/books/arch-handbook/sysinit/_index.po | 393 |
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" |
