diff --git a/documentation/content/ru/books/arch-handbook/_index.adoc b/documentation/content/ru/books/arch-handbook/_index.adoc --- a/documentation/content/ru/books/arch-handbook/_index.adoc +++ b/documentation/content/ru/books/arch-handbook/_index.adoc @@ -1,5 +1,5 @@ --- -add_single_page_link: true +add_single_page_link: 'true' authors: - author: 'The FreeBSD Documentation Project' @@ -9,7 +9,7 @@ next: books/arch-handbook/parti params: path: /books/arch-handbook/ -showBookMenu: true +showBookMenu: 'true' tags: ["Arch Handbook", "FreeBSD"] title: 'Руководство по архитектуре FreeBSD' trademarks: ["freebsd", "apple", "microsoft", "unix", "general"] diff --git a/documentation/content/ru/books/arch-handbook/_index.po b/documentation/content/ru/books/arch-handbook/_index.po --- a/documentation/content/ru/books/arch-handbook/_index.po +++ b/documentation/content/ru/books/arch-handbook/_index.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\n" +"POT-Creation-Date: 2025-05-01 19:56-0300\n" "PO-Revision-Date: 2025-08-16 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian =20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" -#. type: Yaml Front Matter Hash Value: description +#. type: YAML Front Matter: description #: documentation/content/en/books/arch-handbook/_index.adoc:1 #, no-wrap msgid "For FreeBSD system developers. This book covers the architectural details of many important FreeBSD kernel subsystems" -msgstr "Для разработчиков систем FreeBSD. В этой книге рассматриваются архитектурные особенности многих важных подсистем ядра FreeBSD" +msgstr "" +"Для разработчиков систем FreeBSD. В этой книге рассматриваются архитектурные " +"особенности многих важных подсистем ядра FreeBSD" #. type: Title = #: documentation/content/en/books/arch-handbook/_index.adoc:1 @@ -31,12 +33,12 @@ msgid "FreeBSD Architecture Handbook" msgstr "Руководство по архитектуре FreeBSD" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/books/arch-handbook/_index.adoc:51 msgid "Abstract" msgstr "Аннотация" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/books/arch-handbook/_index.adoc:53 msgid "" "Welcome to the FreeBSD Architecture Handbook. This manual is a _work in " @@ -50,7 +52,7 @@ "Если вы хотите помочь в работе над этим проектом, напишите на электронную " "почту списка рассылки {freebsd-doc}." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/books/arch-handbook/_index.adoc:55 msgid "" "The latest version of this document is always available from the " @@ -61,11 +63,11 @@ msgstr "" "Актуальная версия этого документа всегда доступна на https://www.FreeBSD.org/" "[официальном веб-сервере FreeBSD]. Его также можно загрузить в различных " -"форматах и с разными вариантами сжатия с https://download.freebsd.org/doc/" -"[сервера загрузок FreeBSD] или одного из многочисленных зеркал extref:" -"{handbook}mirrors/[mirror sites, mirrors]." +"форматах и с разными вариантами сжатия с https://download.freebsd.org/doc/[" +"сервера загрузок FreeBSD] или одного из многочисленных зеркал " +"extref:{handbook}mirrors/[mirror sites, mirrors]." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/books/arch-handbook/_index.adoc:56 msgid "'''" msgstr "'''" diff --git a/documentation/content/ru/books/arch-handbook/bibliography/_index.adoc b/documentation/content/ru/books/arch-handbook/bibliography/_index.adoc --- a/documentation/content/ru/books/arch-handbook/bibliography/_index.adoc +++ b/documentation/content/ru/books/arch-handbook/bibliography/_index.adoc @@ -3,7 +3,7 @@ params: path: /books/arch-handbook/bibliography/ prev: books/arch-handbook/partiii -showBookMenu: true +showBookMenu: 'true' tags: ["bibliography", "Arch Handbook", "FreeBSD"] title: Библиография weight: 20 diff --git a/documentation/content/ru/books/arch-handbook/bibliography/_index.po b/documentation/content/ru/books/arch-handbook/bibliography/_index.po --- a/documentation/content/ru/books/arch-handbook/bibliography/_index.po +++ b/documentation/content/ru/books/arch-handbook/bibliography/_index.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\n" +"POT-Creation-Date: 2025-05-01 19:56-0300\n" "PO-Revision-Date: 2025-07-12 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian =20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" -#. type: Yaml Front Matter Hash Value: description +#. type: YAML Front Matter: description #: documentation/content/en/books/arch-handbook/bibliography/_index.adoc:1 #, no-wrap msgid "Bibliography of the FreeBSD Architecture Handbook" @@ -31,7 +31,7 @@ msgid "Bibliography" msgstr "Библиография" -#. type: appendix +#. type: Plain text #: documentation/content/en/books/arch-handbook/bibliography/_index.adoc:51 msgid "" "[1] _Marshall Kirk McKusick, Keith Bostic, Michael J Karels, and John S " diff --git a/documentation/content/ru/books/arch-handbook/book.adoc b/documentation/content/ru/books/arch-handbook/book.adoc --- a/documentation/content/ru/books/arch-handbook/book.adoc +++ b/documentation/content/ru/books/arch-handbook/book.adoc @@ -1,5 +1,5 @@ --- -add_split_page_link: true +add_split_page_link: 'true' authors: - author: 'The FreeBSD Documentation Project' diff --git a/documentation/content/ru/books/arch-handbook/book.po b/documentation/content/ru/books/arch-handbook/book.po --- a/documentation/content/ru/books/arch-handbook/book.po +++ b/documentation/content/ru/books/arch-handbook/book.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\n" +"POT-Creation-Date: 2022-07-07 23:22-0300\n" "PO-Revision-Date: 2025-08-16 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian =20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" -#. type: Yaml Front Matter Hash Value: description +#. type: YAML Front Matter: description #: documentation/content/en/books/arch-handbook/book.adoc:1 #, no-wrap msgid "For FreeBSD system developers. This book covers the architectural details of many important FreeBSD kernel subsystems" -msgstr "Для разработчиков систем FreeBSD. В этой книге рассматриваются архитектурные особенности многих важных подсистем ядра FreeBSD" +msgstr "" +"Для разработчиков систем FreeBSD. В этой книге рассматриваются архитектурные " +"особенности многих важных подсистем ядра FreeBSD" #. type: Title = #: documentation/content/en/books/arch-handbook/book.adoc:1 @@ -31,12 +33,12 @@ msgid "FreeBSD Architecture Handbook" msgstr "Руководство по архитектуре FreeBSD" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/books/arch-handbook/book.adoc:49 msgid "Abstract" msgstr "Аннотация" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/books/arch-handbook/book.adoc:51 msgid "" "Welcome to the FreeBSD Architecture Handbook. This manual is a _work in " @@ -50,22 +52,22 @@ "Если вы хотите помочь в работе над этим проектом, напишите на электронную " "почту списка рассылки {freebsd-doc}." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/books/arch-handbook/book.adoc:53 msgid "" -"The latest version of this document is always available from the " -"link:https://www.FreeBSD.org/[FreeBSD World Wide Web server]. It may also be " +"The latest version of this document is always available from the link:" +"https://www.FreeBSD.org/[FreeBSD World Wide Web server]. It may also be " "downloaded in a variety of formats and compression options from the https://" "download.freebsd.org/doc/[FreeBSD download server] or one of the numerous " "extref:{handbook}[mirror sites, mirrors]." msgstr "" "Актуальная версия этого документа всегда доступна на https://www.FreeBSD.org/" "[официальном веб-сервере FreeBSD]. Его также можно загрузить в различных " -"форматах и с разными вариантами сжатия с https://download.freebsd.org/doc/" -"[сервера загрузок FreeBSD] или одного из многочисленных зеркал extref:" -"{handbook}mirrors/[mirror sites, mirrors]." +"форматах и с разными вариантами сжатия с https://download.freebsd.org/doc/[" +"сервера загрузок FreeBSD] или одного из многочисленных зеркал " +"extref:{handbook}mirrors/[mirror sites, mirrors]." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/books/arch-handbook/book.adoc:55 msgid "'''" msgstr "'''" diff --git a/documentation/content/ru/books/arch-handbook/boot/_index.adoc b/documentation/content/ru/books/arch-handbook/boot/_index.adoc --- a/documentation/content/ru/books/arch-handbook/boot/_index.adoc +++ b/documentation/content/ru/books/arch-handbook/boot/_index.adoc @@ -4,7 +4,7 @@ params: path: /books/arch-handbook/boot/ prev: books/arch-handbook/parti -showBookMenu: true +showBookMenu: 'true' tags: ["boot", "BIOS", "kernel", "MBR", "FreeBSD"] title: 'Глава 1. Начальная загрузка и инициализация ядра' weight: 2 diff --git a/documentation/content/ru/books/arch-handbook/boot/_index.po b/documentation/content/ru/books/arch-handbook/boot/_index.po --- a/documentation/content/ru/books/arch-handbook/boot/_index.po +++ b/documentation/content/ru/books/arch-handbook/boot/_index.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\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 \n" "Language-Team: Russian boot`." @@ -1819,12 +1826,12 @@ "in the next section." msgstr "" "Итак, [.filename]#boot1# занимает ровно первые 512 байт [.filename]#boot#, " -"и, поскольку [.filename]#boot# записывается в первый сектор слайса FreeBSD, " -"[.filename]#boot1# полностью помещается в этот первый сектор. Когда `nread` " -"читает первые 16 секторов слайса FreeBSD, он фактически читает весь файл " -"[.filename]#boot# footnote:[512*16=8192 байта, ровно размер boot]. Более " -"подробно о том, как [.filename]#boot# формируется из [.filename]#boot1# и " -"[.filename]#boot2#, мы увидим в следующем разделе." +"и, поскольку [.filename]#boot# записывается в первый сектор слайса FreeBSD, [" +".filename]#boot1# полностью помещается в этот первый сектор. Когда `nread` " +"читает первые 16 секторов слайса FreeBSD, он фактически читает весь файл [." +"filename]#boot# footnote:[512*16=8192 байта, ровно размер boot]. Более " +"подробно о том, как [.filename]#boot# формируется из [.filename]#boot1# и [." +"filename]#boot2#, мы увидим в следующем разделе." #. type: Plain text #: documentation/content/en/books/arch-handbook/boot/_index.adoc:713 @@ -1840,10 +1847,10 @@ "Напомним, что `nread` использует адрес памяти `0x8c00` в качестве буфера " "передачи для хранения прочитанных секторов. Этот адрес выбран не случайно. " "Действительно, поскольку [.filename]#boot1# принадлежит первым 512 байтам, " -"он оказывается в диапазоне адресов `0x8c00`-`0x8dff`. Следующие 512 байт " -"(диапазон `0x8e00`-`0x8fff`) используются для хранения _bsdlabel_ footnote:" -"[Исторически известной как disklabel. Если вам когда-либо было интересно, " -"где FreeBSD хранит эту информацию, она находится в этой области — см. " +"он оказывается в диапазоне адресов `0x8c00`-`0x8dff`. Следующие 512 байт (" +"диапазон `0x8e00`-`0x8fff`) используются для хранения _bsdlabel_ footnote:[" +"Исторически известной как disklabel. Если вам когда-либо было интересно, где " +"FreeBSD хранит эту информацию, она находится в этой области — см. " "man:bsdlabel[8]]." #. type: Plain text @@ -1990,11 +1997,11 @@ "`0x9010`, the entry point of the BTX server." msgstr "" "[.filename]#boot1# загружает первые 16 секторов среза FreeBSD по адресу " -"`0x8c00`. Эти 16 секторов, или 8192 байта, представляют собой весь файл " -"[.filename]#boot#. Файл является объединением [.filename]#boot1# и " -"[.filename]#boot2#. [.filename]#boot2#, в свою очередь, содержит сервер BTX " -"и клиент [.filename]#boot2#. Наконец, выполняется переход по адресу " -"`0x9010`, точке входа сервера BTX." +"`0x8c00`. Эти 16 секторов, или 8192 байта, представляют собой весь файл [." +"filename]#boot#. Файл является объединением [.filename]#boot1# и [." +"filename]#boot2#. [.filename]#boot2#, в свою очередь, содержит сервер BTX и " +"клиент [.filename]#boot2#. Наконец, выполняется переход по адресу `0x9010`, " +"точке входа сервера BTX." #. type: Plain text #: documentation/content/en/books/arch-handbook/boot/_index.adoc:770 @@ -2006,10 +2013,9 @@ "creates the [.filename]#boot# file:" msgstr "" "Прежде чем изучать сервер BTX подробно, давайте рассмотрим, как создается " -"единый, всеобъемлющий файл [.filename]#boot#. Способ сборки " -"[.filename]#boot# определен в его [.filename]#Makefile# ([.filename]#stand/" -"i386/boot2/Makefile#). Рассмотрим правило, которое создает файл " -"[.filename]#boot#:" +"единый, всеобъемлющий файл [.filename]#boot#. Способ сборки [.filename]#boot#" +" определен в его [.filename]#Makefile# ([.filename]#stand/i386/boot2/" +"Makefile#). Рассмотрим правило, которое создает файл [.filename]#boot#:" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/boot/_index.adoc:775 @@ -2036,8 +2042,8 @@ "simple:" msgstr "" "Это говорит нам, что [.filename]#boot1# и [.filename]#boot2# необходимы, и " -"правило просто объединяет их для создания одного файла с именем " -"[.filename]#boot#. Правила для создания [.filename]#boot1# также довольно " +"правило просто объединяет их для создания одного файла с именем [." +"filename]#boot#. Правила для создания [.filename]#boot1# также довольно " "просты:" #. type: delimited block . 4 @@ -2058,7 +2064,8 @@ "\t${LD} ${LD_FLAGS} -e start --defsym ORG=${ORG1} -T ${LDSCRIPT} -o ${.TARGET} boot1.o\n" msgstr "" " boot1.out: boot1.o\n" -"\t${LD} ${LD_FLAGS} -e start --defsym ORG=${ORG1} -T ${LDSCRIPT} -o ${.TARGET} boot1.o\n" +"\t${LD} ${LD_FLAGS} -e start --defsym ORG=${ORG1} -T ${LDSCRIPT} -o ${." +"TARGET} boot1.o\n" #. type: Block title #: documentation/content/en/books/arch-handbook/boot/_index.adoc:790 @@ -2082,18 +2089,18 @@ "and symbolic information; `-O binary` indicates the output format, that is, " "a simple, unformatted binary file." msgstr "" -"Для применения правила создания [.filename]#boot1# необходимо собрать " -"[.filename]#boot1.out#. Это, в свою очередь, зависит от наличия " -"[.filename]#boot1.o#. Последний файл является результатом ассемблирования " +"Для применения правила создания [.filename]#boot1# необходимо собрать [." +"filename]#boot1.out#. Это, в свою очередь, зависит от наличия [." +"filename]#boot1.o#. Последний файл является результатом ассемблирования " "нашего знакомого [.filename]#boot1.S# без компоновки. Теперь применяется " -"правило создания [.filename]#boot1.out#. Оно указывает, что " -"[.filename]#boot1.o# должен быть скомпонован с точкой входа `start` и " -"начальным адресом `0x7c00`. Наконец, [.filename]#boot1# создается из " -"[.filename]#boot1.out# применением соответствующего правила. Это команда " -"[.filename]#objcopy#, применяемая к [.filename]#boot1.out#. Обратите " -"внимание на флаги, передаваемые [.filename]#objcopy#: `-S` указывает на " -"удаление всей информации о перемещении и символов; `-O binary` указывает " -"формат вывода, то есть простой, неформатированный двоичный файл." +"правило создания [.filename]#boot1.out#. Оно указывает, что [.filename]#boot1" +".o# должен быть скомпонован с точкой входа `start` и начальным адресом " +"`0x7c00`. Наконец, [.filename]#boot1# создается из [.filename]#boot1.out# " +"применением соответствующего правила. Это команда [.filename]#objcopy#, " +"применяемая к [.filename]#boot1.out#. Обратите внимание на флаги, " +"передаваемые [.filename]#objcopy#: `-S` указывает на удаление всей " +"информации о перемещении и символов; `-O binary` указывает формат вывода, то " +"есть простой, неформатированный двоичный файл." #. type: Plain text #: documentation/content/en/books/arch-handbook/boot/_index.adoc:801 @@ -2157,7 +2164,8 @@ "\t${LD} ${LD_FLAGS} --defsym ORG=${ORG2} -T ${LDSCRIPT} -o ${.TARGET} ${.ALLSRC}\n" msgstr "" " boot2.out: ${BTXCRT} boot2.o sio.o ashldi3.o\n" -"\t${LD} ${LD_FLAGS} --defsym ORG=${ORG2} -T ${LDSCRIPT} -o ${.TARGET} ${.ALLSRC}\n" +"\t${LD} ${LD_FLAGS} --defsym ORG=${ORG2} -T ${LDSCRIPT} -o ${.TARGET} ${." +"ALLSRC}\n" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/boot/_index.adoc:828 @@ -2173,7 +2181,8 @@ " boot2.h: boot1.out\n" "\t${NM} -t d ${.ALLSRC} | awk '/([0-9])+ T xread/ \\\n" "\t { x = $$1 - ORG1; \\\n" -"\t printf(\"#define XREADORG %#x\\n\", REL1 + x) }' \\\n" +"\t printf(\"#define XREADORG %#x\\n" +"\", REL1 + x) }' \\\n" "\t ORG1=`printf \"%d\" ${ORG1}` \\\n" "\t REL1=`printf \"%d\" ${REL1}` > ${.TARGET}\n" @@ -2224,8 +2233,8 @@ msgstr "" "Отметим, что изначально файл заголовка [.filename]#boot2.h# отсутствует, но " "его создание зависит от [.filename]#boot1.out#, который у нас уже есть. " -"Правило его создания немного лаконично, но важно то, что результат, " -"[.filename]#boot2.h#, выглядит примерно так:" +"Правило его создания немного лаконично, но важно то, что результат, [." +"filename]#boot2.h#, выглядит примерно так:" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/boot/_index.adoc:851 @@ -2253,13 +2262,12 @@ msgstr "" "Напомним, что [.filename]#boot1# был перемещён (т.е. скопирован из `0x7c00` " "в `0x700`). Это перемещение теперь обретает смысл, потому что, как мы " -"увидим, сервер BTX освобождает часть памяти, включая область, куда " -"[.filename]#boot1# был изначально загружен. Однако серверу BTX необходим " -"доступ к функции `xread` из [.filename]#boot1#; согласно выводу " -"[.filename]#boot2.h#, эта функция находится по адресу `0x725`. " -"Действительно, сервер BTX использует функцию `xread` из перемещённого кода " -"[.filename]#boot1#. Теперь эта функция доступна из клиента " -"[.filename]#boot2#." +"увидим, сервер BTX освобождает часть памяти, включая область, куда [." +"filename]#boot1# был изначально загружен. Однако серверу BTX необходим " +"доступ к функции `xread` из [.filename]#boot1#; согласно выводу [." +"filename]#boot2.h#, эта функция находится по адресу `0x725`. Действительно, " +"сервер BTX использует функцию `xread` из перемещённого кода [." +"filename]#boot1#. Теперь эта функция доступна из клиента [.filename]#boot2#." #. type: Plain text #: documentation/content/en/books/arch-handbook/boot/_index.adoc:868 @@ -2284,11 +2292,11 @@ "выполнения по адресу `0x2000` (${ORG2}). Напомним, что [.filename]#boot2# " "будет выполняться в пользовательском режиме внутри специального " "пользовательского сегмента, созданного сервером BTX. Этот сегмент начинается " -"с адреса `0xa000`. Также помните, что часть [.filename]#boot2# в " -"[.filename]#boot# была скопирована по адресу `0xc000`, то есть со смещением " +"с адреса `0xa000`. Также помните, что часть [.filename]#boot2# в [." +"filename]#boot# была скопирована по адресу `0xc000`, то есть со смещением " "`0x2000` от начала пользовательского сегмента, поэтому [.filename]#boot2# " -"будет работать корректно при передаче управления на него. Далее, " -"[.filename]#boot2.bin# создается из [.filename]#boot2.out# путем удаления " +"будет работать корректно при передаче управления на него. Далее, [." +"filename]#boot2.bin# создается из [.filename]#boot2.out# путем удаления " "символов и информации о формате; boot2.bin представляет собой _сырой_ " "бинарный файл. Теперь обратите внимание, что файл [.filename]#boot2.ldr# " "создается как 512-байтный файл, заполненный нулями. Это пространство " @@ -2306,14 +2314,13 @@ "address `0x9000`. The details can be found in [.filename]#stand/i386/btx/" "btx/Makefile#." msgstr "" -"Теперь, когда у нас есть файлы [.filename]#boot1#, [.filename]#boot2.bin# и " -"[.filename]#boot2.ldr#, осталось только добавить сервер BTX перед созданием " -"универсального файла [.filename]#boot#. Сервер BTX находится в " -"[.filename]#stand/i386/btx/btx#; у него есть собственный " -"[.filename]#Makefile# со своим набором правил для сборки. Важно отметить, " -"что он также компилируется как _сырой_ бинарный файл и линкуется для " -"выполнения по адресу `0x9000`. Подробности можно найти в [.filename]#stand/" -"i386/btx/btx/Makefile#." +"Теперь, когда у нас есть файлы [.filename]#boot1#, [.filename]#boot2.bin# и [" +".filename]#boot2.ldr#, осталось только добавить сервер BTX перед созданием " +"универсального файла [.filename]#boot#. Сервер BTX находится в [.filename]#" +"stand/i386/btx/btx#; у него есть собственный [.filename]#Makefile# со своим " +"набором правил для сборки. Важно отметить, что он также компилируется как " +"_сырой_ бинарный файл и линкуется для выполнения по адресу `0x9000`. " +"Подробности можно найти в [.filename]#stand/i386/btx/btx/Makefile#." #. type: Plain text #: documentation/content/en/books/arch-handbook/boot/_index.adoc:880 @@ -2335,11 +2342,11 @@ "названием [.filename]#btxld# (исходный код расположен в [.filename]#/usr/src/" "usr.sbin/btxld#). Некоторые аргументы этой программы включают имя выходного " "файла ([.filename]#boot#), его точку входа (`0x2000`) и формат файла " -"(бинарный). Различные файлы окончательно объединяются этой утилитой в файл " -"[.filename]#boot#, который состоит из [.filename]#boot1#, " -"[.filename]#boot2#, `bsdlabel` и сервера BTX. Этот файл, занимающий ровно 16 " -"секторов или 8192 байта, записывается в начало раздела FreeBSD во время " -"установки. Теперь перейдем к изучению программы сервера BTX." +"(бинарный). Различные файлы окончательно объединяются этой утилитой в файл [." +"filename]#boot#, который состоит из [.filename]#boot1#, [.filename]#boot2#, " +"`bsdlabel` и сервера BTX. Этот файл, занимающий ровно 16 секторов или 8192 " +"байта, записывается в начало раздела FreeBSD во время установки. Теперь " +"перейдем к изучению программы сервера BTX." #. type: Plain text #: documentation/content/en/books/arch-handbook/boot/_index.adoc:883 @@ -2412,12 +2419,11 @@ "has a special header at address range `0x9000-0x900f`, right before its " "entry point. This header is defined as follows:" msgstr "" -"Приступим к изучению фактической реализации. Напомним, что " -"[.filename]#boot1# выполнил переход на адрес `0x9010` — точку входа сервера " -"BTX. Прежде чем изучать выполнение программы там, обратите внимание, что " -"сервер BTX имеет специальный заголовок в диапазоне адресов `0x9000-0x900f`, " -"непосредственно перед точкой входа. Этот заголовок определён следующим " -"образом:" +"Приступим к изучению фактической реализации. Напомним, что [.filename]#boot1#" +" выполнил переход на адрес `0x9010` — точку входа сервера BTX. Прежде чем " +"изучать выполнение программы там, обратите внимание, что сервер BTX имеет " +"специальный заголовок в диапазоне адресов `0x9000-0x900f`, непосредственно " +"перед точкой входа. Этот заголовок определён следующим образом:" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/boot/_index.adoc:915 @@ -2469,10 +2475,10 @@ msgstr "" "Обратите внимание, что первые два байта — это `0xeb` и `0xe`. В архитектуре " "IA-32 эти два байта интерпретируются как относительный переход за заголовок " -"к точке входа, поэтому теоретически [.filename]#boot1# мог бы перейти сюда " -"(адрес `0x9000`) вместо адреса `0x9010`. Обратите внимание, что последнее " -"поле в заголовке BTX — это указатель на точку входа клиента " -"([.filename]#boot2#)b2. Это поле исправляется во время компоновки." +"к точке входа, поэтому теоретически [.filename]#boot1# мог бы перейти сюда (" +"адрес `0x9000`) вместо адреса `0x9010`. Обратите внимание, что последнее " +"поле в заголовке BTX — это указатель на точку входа клиента ([." +"filename]#boot2#)b2. Это поле исправляется во время компоновки." #. type: Plain text #: documentation/content/en/books/arch-handbook/boot/_index.adoc:924 @@ -2759,8 +2765,8 @@ "только дескрипторы для векторов прерываний `0x30`, `0x31` и `0x32` имеют " "уровень привилегий 3, такой же, как у клиента [.filename]#boot2#, что " "означает, что клиент может выполнить программно-генерируемое прерывание к " -"этим векторам через инструкцию `int` без ошибки (это способ, которым " -"[.filename]#boot2# использует сервисы, предоставляемые сервером BTX). Также " +"этим векторам через инструкцию `int` без ошибки (это способ, которым [." +"filename]#boot2# использует сервисы, предоставляемые сервером BTX). Также " "обратите внимание, что _только_ программно-генерируемые прерывания защищены " "от кода, выполняющегося на более низких уровнях привилегий. Аппаратно-" "генерируемые прерывания и исключения, генерируемые процессором, _всегда_ " @@ -2931,8 +2937,8 @@ msgstr "" "Наш последний блок кода отвечает за загрузку TR (Регистра Задач) с " "селектором сегмента для TSS, который мы создали ранее, и настройку окружения " -"пользовательского режима перед передачей управления исполнения клиенту " -"[.filename]#boot2#." +"пользовательского режима перед передачей управления исполнения клиенту [." +"filename]#boot2#." #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/boot/_index.adoc:1123 @@ -3181,14 +3187,13 @@ msgstr "" "`boot2` входит в бесконечный цикл, ожидая ввода пользователя, затем вызывает " "`load()`. Если пользователь ничего не нажимает, цикл прерывается по " -"таймауту, и `load()` загружает файл по умолчанию ([.filename]#/boot/" -"loader#). Функции `ino_t lookup(char *filename)` и `int xfsread(ino_t inode, " -"void *buf, size_t nbyte)` используются для чтения содержимого файла в " -"память. [.filename]#/boot/loader# — это ELF-бинарный файл, но с заголовком " -"ELF, перед которым добавлена структура `struct exec` из [.filename]#a.out#. " -"`load()` анализирует ELF-заголовок загрузчика, загружает содержимое " -"[.filename]#/boot/loader# в память и передаёт управление на точку входа " -"загрузчика:" +"таймауту, и `load()` загружает файл по умолчанию ([.filename]#/boot/loader#)" +". Функции `ino_t lookup(char *filename)` и `int xfsread(ino_t inode, void *" +"buf, size_t nbyte)` используются для чтения содержимого файла в память. [." +"filename]#/boot/loader# — это ELF-бинарный файл, но с заголовком ELF, перед " +"которым добавлена структура `struct exec` из [.filename]#a.out#. `load()` " +"анализирует ELF-заголовок загрузчика, загружает содержимое [.filename]#/boot/" +"loader# в память и передаёт управление на точку входа загрузчика:" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/boot/_index.adoc:1201 @@ -3275,8 +3280,10 @@ "\n" msgstr "" "/usr/obj/usr/src/i386.i386/sys/GENERIC/kernel.meta:\n" -"ld -m elf_i386_fbsd -Bdynamic -T /usr/src/sys/conf/ldscript.i386 --build-id=sha1 --no-warn-mismatch \\\n" -"--warn-common --export-dynamic --dynamic-linker /red/herring -X -o kernel locore.o\n" +"ld -m elf_i386_fbsd -Bdynamic -T /usr/src/sys/conf/ldscript.i386 --build-" +"id=sha1 --no-warn-mismatch \\\n" +"--warn-common --export-dynamic --dynamic-linker /red/herring -X -o kernel " +"locore.o\n" "\n" #. type: Plain text @@ -3312,8 +3319,8 @@ "says that a kernel's entry point is the symbol `btext`. This symbol is " "defined in [.filename]#locore.s#:" msgstr "" -"говорит, что точка входа ядра — это символ `btext`. Этот символ определён в " -"[.filename]#locore.s#:" +"говорит, что точка входа ядра — это символ `btext`. Этот символ определён в [" +".filename]#locore.s#:" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/boot/_index.adoc:1261 @@ -3405,8 +3412,11 @@ "This function determines the booting method, and stores the `struct bootinfo` structure into the kernel memory." msgstr "" "Эта процедура разбирает параметры, переданные ядру при загрузке.\n" -"Ядро могло быть загружено тремя способами: загрузчиком (как описано выше), старыми загрузочными блоками диска или по старой процедуре загрузки без диска.\n" -"Эта функция определяет метод загрузки и сохраняет структуру `struct bootinfo` в памяти ядра." +"Ядро могло быть загружено тремя способами: загрузчиком (как описано выше), " +"старыми загрузочными блоками диска или по старой процедуре загрузки без " +"диска.\n" +"Эта функция определяет метод загрузки и сохраняет структуру `struct bootinfo`" +" в памяти ядра." #. type: Table #: documentation/content/en/books/arch-handbook/boot/_index.adoc:1295 @@ -3418,7 +3428,9 @@ #: documentation/content/en/books/arch-handbook/boot/_index.adoc:1296 #, no-wrap msgid "This function tries to find out what CPU it is running on, storing the value found in a variable `_cpu`." -msgstr "Эта функция пытается определить, на каком процессоре она выполняется, сохраняя найденное значение в переменной `_cpu`." +msgstr "" +"Эта функция пытается определить, на каком процессоре она выполняется, " +"сохраняя найденное значение в переменной `_cpu`." #. type: Plain text #: documentation/content/en/books/arch-handbook/boot/_index.adoc:1299 @@ -3970,8 +3982,8 @@ "[.filename]#/usr/include/machine/pcb.h# and has a process's information " "specific to the i386 architecture, such as registers values." msgstr "" -"Структура `struct pcb` является частью структуры proc. Она определена в " -"[.filename]#/usr/include/machine/pcb.h# и содержит информацию процесса, " +"Структура `struct pcb` является частью структуры proc. Она определена в [." +"filename]#/usr/include/machine/pcb.h# и содержит информацию процесса, " "специфичную для архитектуры i386, такую как значения регистров." #. type: Title === @@ -4059,7 +4071,8 @@ "\tprintf(\"%s\", (char *)data);\n" "}\n" "/* ... skipped ... */\n" -"SYSINIT(announce, SI_SUB_COPYRIGHT, SI_ORDER_FIRST, print_caddr_t, copyright);\n" +"SYSINIT(announce, SI_SUB_COPYRIGHT, SI_ORDER_FIRST, print_caddr_t, " +"copyright);\n" #. type: Plain text #: documentation/content/en/books/arch-handbook/boot/_index.adoc:1553 @@ -4096,7 +4109,8 @@ "/usr/include/sys/kernel.h:\n" " #define C_SYSINIT(uniquifier, subsystem, order, func, ident) \\\n" " static struct sysinit uniquifier ## _sys_init = { \\ subsystem, \\\n" -" order, \\ func, \\ (ident) \\ }; \\ DATA_WSET(sysinit_set,uniquifier ##\n" +" order, \\ func, \\ (ident) \\ }; \\ DATA_WSET(sysinit_set,uniquifier ##" +"\n" " _sys_init);\n" #. type: delimited block . 4 @@ -4186,8 +4200,8 @@ "By defining a variable of type `struct sysinit` the content of " "`set.sysinit_set` section will be \"collected\" into that variable:" msgstr "" -"Определяя переменную типа `struct sysinit`, содержимое раздела " -"`set.sysinit_set` будет \"собрано\" в эту переменную:" +"Определяя переменную типа `struct sysinit`, содержимое раздела `set." +"sysinit_set` будет \"собрано\" в эту переменную:" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/boot/_index.adoc:1605 @@ -4268,11 +4282,11 @@ "0, the swapper process. The thread0 structure, mentioned before, is used to " "describe it." msgstr "" -"Системный планировщик sysinit определен в файле [.filename]#sys/vm/" -"vm_glue.c#, а точка входа для этого объекта — `scheduler()`. Эта функция " -"фактически представляет собой бесконечный цикл и описывает процесс с PID 0, " -"известный как процесс swapper. Структура thread0, упомянутая ранее, " -"используется для его описания." +"Системный планировщик sysinit определен в файле [.filename]#sys/vm/vm_glue.c#" +", а точка входа для этого объекта — `scheduler()`. Эта функция фактически " +"представляет собой бесконечный цикл и описывает процесс с PID 0, известный " +"как процесс swapper. Структура thread0, упомянутая ранее, используется для " +"его описания." #. type: Plain text #: documentation/content/en/books/arch-handbook/boot/_index.adoc:1642 @@ -4347,7 +4361,8 @@ "\tfr.fr_procp = &initproc;\n" "\terror = fork1(&thread0, &fr);\n" "\tif (error)\n" -"\t\tpanic(\"cannot fork init: %d\\n\", error);\n" +"\t\tpanic(\"cannot fork init: %d\\n" +"\", error);\n" "\tKASSERT(initproc->p_pid == 1, (\"create_init: initproc->p_pid != 1\"));\n" "\t/* divorce init's credentials from the kernel's */\n" "\tnewcred = crget();\n" @@ -4371,7 +4386,8 @@ "\tPROC_UNLOCK(initproc);\n" "\tsx_xunlock(&proctree_lock);\n" "\tcrfree(oldcred);\n" -"\tcpu_fork_kthread_handler(FIRST_THREAD_IN_PROC(initproc), start_init, NULL);\n" +"\tcpu_fork_kthread_handler(FIRST_THREAD_IN_PROC(initproc), start_init, NULL);" +"\n" "}\n" "SYSINIT(init, SI_SUB_CREATE_INIT, SI_ORDER_FIRST, create_init, NULL);\n" @@ -4391,8 +4407,8 @@ "запланирован для выполнения планировщиком, будет вызвана функция " "`start_init()`. Эта функция определена в [.filename]#init_main.c#. Она " "пытается загрузить и выполнить бинарный файл [.filename]#init#, сначала " -"проверяя [.filename]#/sbin/init#, затем [.filename]#/sbin/oinit#, " -"[.filename]#/sbin/init.bak# и, наконец, [.filename]#/rescue/init#:" +"проверяя [.filename]#/sbin/init#, затем [.filename]#/sbin/oinit#, [." +"filename]#/sbin/init.bak# и, наконец, [.filename]#/rescue/init#:" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/boot/_index.adoc:1702 diff --git a/documentation/content/ru/books/arch-handbook/driverbasics/_index.adoc b/documentation/content/ru/books/arch-handbook/driverbasics/_index.adoc --- a/documentation/content/ru/books/arch-handbook/driverbasics/_index.adoc +++ b/documentation/content/ru/books/arch-handbook/driverbasics/_index.adoc @@ -4,7 +4,7 @@ params: path: /books/arch-handbook/driverbasics/ prev: books/arch-handbook/partii -showBookMenu: true +showBookMenu: 'true' tags: ["writing", "device drivers", "KLD", "FreeBSD"] title: 'Глава 9. Написание драйверов устройств для FreeBSD' weight: 11 diff --git a/documentation/content/ru/books/arch-handbook/driverbasics/_index.po b/documentation/content/ru/books/arch-handbook/driverbasics/_index.po --- a/documentation/content/ru/books/arch-handbook/driverbasics/_index.po +++ b/documentation/content/ru/books/arch-handbook/driverbasics/_index.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\n" +"POT-Creation-Date: 2025-05-01 19:56-0300\n" "PO-Revision-Date: 2025-09-23 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian msg, amt, uio)) != 0)\n" -"\t\tuprintf(\"uiomove failed!\\n\");\n" +"\t\tuprintf(\"uiomove failed!\\n" +"\");\n" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:280 @@ -746,7 +755,8 @@ "}\n" msgstr "" "\tif (error != 0)\n" -"\t\tuprintf(\"Write failed: bad address!\\n\");\n" +"\t\tuprintf(\"Write failed: bad address!\\n" +"\");\n" "\treturn (error);\n" "}\n" diff --git a/documentation/content/ru/books/arch-handbook/isa/_index.adoc b/documentation/content/ru/books/arch-handbook/isa/_index.adoc --- a/documentation/content/ru/books/arch-handbook/isa/_index.adoc +++ b/documentation/content/ru/books/arch-handbook/isa/_index.adoc @@ -4,7 +4,7 @@ params: path: /books/arch-handbook/isa/ prev: books/arch-handbook/driverbasics -showBookMenu: true +showBookMenu: 'true' tags: ["ISA", "device drivers", "FreeBSD"] title: 'Глава 10. Драйверы устройств ISA' weight: 12 diff --git a/documentation/content/ru/books/arch-handbook/isa/_index.po b/documentation/content/ru/books/arch-handbook/isa/_index.po --- a/documentation/content/ru/books/arch-handbook/isa/_index.po +++ b/documentation/content/ru/books/arch-handbook/isa/_index.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\n" +"POT-Creation-Date: 2025-05-01 19:56-0300\n" "PO-Revision-Date: 2025-09-01 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian mem0_p = xxx_read_mem0_from_device_config(sc);\n" msgstr "" " /* try to find out the config address first */\n" -" sc->mem0_p = bus_get_resource_start(dev, SYS_RES_MEMORY, 0 /*rid*/);\n" +" sc->mem0_p = bus_get_resource_start(dev, SYS_RES_MEMORY, 0 " +"/*rid*/);\n" " if(sc->mem0_p == 0) { /* nope, not specified by user */\n" " sc->mem0_p = xxx_read_mem0_from_device_config(sc);\n" @@ -3295,15 +3300,20 @@ msgstr "" " /* just like the port, set the memory size,\n" " * for some devices the memory size would not be constant\n" -" * but should be read from the device configuration registers instead\n" -" * to accommodate different models of devices. Another option would\n" -" * be to let the user set the memory size as \"msize\" configuration\n" +" * but should be read from the device configuration registers " +"instead\n" +" * to accommodate different models of devices. Another option " +"would\n" +" * be to let the user set the memory size as \"msize\" " +"configuration\n" " * resource which will be automatically handled by the ISA bus.\n" " */\n" " if(pnperror) { /* only for non-PnP devices */\n" -" sc->mem0_size = bus_get_resource_count(dev, SYS_RES_MEMORY, 0 /*rid*/);\n" +" sc->mem0_size = bus_get_resource_count(dev, SYS_RES_MEMORY, 0 " +"/*rid*/);\n" " if(sc->mem0_size == 0) /* not specified by user */\n" -" sc->mem0_size = xxx_read_mem0_size_from_device_config(sc);\n" +" sc->mem0_size = xxx_read_mem0_size_from_device_config(sc);" +"\n" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/isa/_index.adoc:803 @@ -3320,7 +3330,8 @@ msgstr "" " if(sc->mem0_size == 0) {\n" " /* suppose this is a very old model of device without\n" -" * auto-configuration features and the user gave no preference,\n" +" * auto-configuration features and the user gave no " +"preference,\n" " * so assume the minimalistic case\n" " * (of course, the real value will vary with the driver)\n" " */\n" @@ -3352,7 +3363,8 @@ " sc->mem0_p, sc->mem0_size)<0)\n" " goto bad;\n" " } else {\n" -" sc->mem0_size = bus_get_resource_count(dev, SYS_RES_MEMORY, 0 /*rid*/);\n" +" sc->mem0_size = bus_get_resource_count(dev, SYS_RES_MEMORY, 0 " +"/*rid*/);\n" " }\n" #. type: Plain text @@ -3482,7 +3494,8 @@ " bus_dmamap_unload(sc->data_tag, sc->data_map);\n" " sc->data_p = 0;\n" " }\n" -" if(sc->data) { /* sc->data_map may be legitimately equal to 0 */\n" +" if(sc->data) { /* sc->data_map may be legitimately equal to 0 " +"*/\n" " /* the map will also be freed */\n" " bus_dmamem_free(sc->data_tag, sc->data, sc->data_map);\n" " sc->data = 0;\n" @@ -3532,13 +3545,15 @@ msgstr "" " /* release all the bus resources */\n" " if(sc->mem0_r) {\n" -" bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->mem0_rid,\n" +" bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->mem0_rid," +"\n" " sc->mem0_r);\n" " sc->mem0_r = 0;\n" " }\n" " ...\n" " if(sc->port0_r) {\n" -" bus_release_resource(sc->dev, SYS_RES_IOPORT, sc->port0_rid,\n" +" bus_release_resource(sc->dev, SYS_RES_IOPORT, " +"sc->port0_rid,\n" " sc->port0_r);\n" " sc->port0_r = 0;\n" " }\n" @@ -3628,7 +3643,8 @@ " /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);\n" msgstr "" " sc->port0_rid = 0;\n" -" sc->port0_r = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->port0_rid,\n" +" sc->port0_r = bus_alloc_resource(dev, SYS_RES_IOPORT, " +"&sc->port0_rid,\n" " /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);\n" #. type: delimited block . 4 @@ -3652,7 +3668,8 @@ msgstr "" " /* on-board memory */\n" " sc->mem0_rid = 0;\n" -" sc->mem0_r = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->mem0_rid,\n" +" sc->mem0_r = bus_alloc_resource(dev, SYS_RES_MEMORY, " +"&sc->mem0_rid,\n" " /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);\n" #. type: delimited block . 4 @@ -3726,7 +3743,8 @@ " /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);\n" msgstr "" " sc->intr_rid = 0;\n" -" sc->intr_r = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->intr_rid,\n" +" sc->intr_r = bus_alloc_resource(dev, SYS_RES_MEMORY, " +"&sc->intr_rid,\n" " /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);\n" #. type: delimited block . 4 @@ -3753,7 +3771,8 @@ " goto bad;\n" msgstr "" " /*\n" -" * XXX_INTR_TYPE is supposed to be defined depending on the type of\n" +" * XXX_INTR_TYPE is supposed to be defined depending on the type " +"of\n" " * the driver, for example as INTR_TYPE_CAM for a CAM driver\n" " */\n" " error = bus_setup_intr(dev, sc->intr_r, XXX_INTR_TYPE,\n" @@ -3786,7 +3805,8 @@ msgstr "" " error=bus_dma_tag_create(NULL, /*alignment*/ 4,\n" " /*boundary*/ 0, /*lowaddr*/ BUS_SPACE_MAXADDR_24BIT,\n" -" /*highaddr*/ BUS_SPACE_MAXADDR, /*filter*/ NULL, /*filterarg*/ NULL,\n" +" /*highaddr*/ BUS_SPACE_MAXADDR, /*filter*/ NULL, /*filterarg*/ " +"NULL,\n" " /*maxsize*/ BUS_SPACE_MAXSIZE_24BIT,\n" " /*nsegments*/ BUS_SPACE_UNRESTRICTED,\n" " /*maxsegsz*/ BUS_SPACE_MAXSIZE_24BIT, /*flags*/ 0,\n" @@ -3816,7 +3836,8 @@ " goto bad;\n" msgstr "" " /* many things get inherited from the parent tag\n" -" * sc->data is supposed to point to the structure with the shared data,\n" +" * sc->data is supposed to point to the structure with the shared " +"data,\n" " * for example for a ring buffer it could be:\n" " * struct {\n" " * u_short rd_pos;\n" @@ -3879,7 +3900,8 @@ " * }\n" " */\n" " bus_dmamap_load(sc->data_tag, sc->data_map, (void *)sc->data,\n" -" sizeof (* sc->data), xxx_alloc_callback, (void *) &sc->data_p,\n" +" sizeof (* sc->data), xxx_alloc_callback, (void *) &sc->data_p," +"\n" " /*flags*/0);\n" #. type: Plain text @@ -3918,7 +3940,9 @@ #: documentation/content/en/books/arch-handbook/isa/_index.adoc:1025 #, no-wrap msgid " device_printf(dev, \"has on-card FIFO buffer of %d bytes\\n\", sc->fifosize);\n" -msgstr " device_printf(dev, \"has on-card FIFO buffer of %d bytes\\n\", sc->fifosize);\n" +msgstr "" +" device_printf(dev, \"has on-card FIFO buffer of %d bytes\\n" +"\", sc->fifosize);\n" #. type: Plain text #: documentation/content/en/books/arch-handbook/isa/_index.adoc:1028 diff --git a/documentation/content/ru/books/arch-handbook/jail/_index.adoc b/documentation/content/ru/books/arch-handbook/jail/_index.adoc --- a/documentation/content/ru/books/arch-handbook/jail/_index.adoc +++ b/documentation/content/ru/books/arch-handbook/jail/_index.adoc @@ -4,7 +4,7 @@ params: path: /books/arch-handbook/jail/ prev: books/arch-handbook/kobj -showBookMenu: true +showBookMenu: 'true' tags: ["jail", "architecture", "networking", "kernel"] title: 'Глава 4. Подсистема клеток' weight: 5 @@ -50,7 +50,7 @@ На большинстве систем UNIX(R) пользователь `root` обладает неограниченной властью. Это не способствует безопасности. Если злоумышленник получит права `root` в системе, у него окажутся все функции под рукой. В FreeBSD существуют sysctl-параметры, которые ограничивают власть `root`, чтобы минимизировать ущерб от действий злоумышленника. В частности, одна из таких функций называется `уровни безопасности`. Аналогично, другая функция, доступная начиная с FreeBSD 4.0, — это утилита man:jail[8] — клетка. Клетка создает chroot-окружение и накладывает определенные ограничения на процессы, запущенные внутри `клетки`. Например, процесс в `клетке` не может влиять на процессы вне её, использовать определенные системные вызовы или наносить какой-либо ущерб основной системе. -Клетка становится новой моделью безопасности. Пользователи запускают потенциально уязвимые серверы, такие как Apache, BIND и sendmail, внутри клеток, так что если злоумышленник получит права `root` внутри клетки, это будет лишь неудобством, а не катастрофой. Данная статья в основном сосредоточена на внутреннем устройстве (исходном коде) клетки. Для получения информации о настройке клетки см. extref:{handbook} jails/[раздел о клетках Руководства FreeBSD, jails-synopsis]. +Клетка становится новой моделью безопасности. Пользователи запускают потенциально уязвимые серверы, такие как Apache, BIND и sendmail, внутри клеток, так что если злоумышленник получит права `root` внутри клетки, это будет лишь неудобством, а не катастрофой. Данная статья в основном сосредоточена на внутреннем устройстве (исходном коде) клетки. Для получения информации о настройке клетки см. extref:{handbook}jails[раздел о клетках Руководства FreeBSD, jails-synopsis]. [[jail-arch]] == Архитектура diff --git a/documentation/content/ru/books/arch-handbook/jail/_index.po b/documentation/content/ru/books/arch-handbook/jail/_index.po --- a/documentation/content/ru/books/arch-handbook/jail/_index.po +++ b/documentation/content/ru/books/arch-handbook/jail/_index.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\n" -"PO-Revision-Date: 2025-08-16 04:45+0000\n" +"POT-Creation-Date: 2025-05-01 19:56-0300\n" +"PO-Revision-Date: 2025-10-16 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian \n" @@ -25,7 +25,7 @@ msgid "The Jail Subsystem" msgstr "Подсистема клеток" -#. type: Yaml Front Matter Hash Value: title +#. type: YAML Front Matter: title #: documentation/content/en/books/arch-handbook/jail/_index.adoc:1 #, no-wrap msgid "Chapter 4. The Jail Subsystem" @@ -72,7 +72,7 @@ "клеток, так что если злоумышленник получит права `root` внутри клетки, это " "будет лишь неудобством, а не катастрофой. Данная статья в основном " "сосредоточена на внутреннем устройстве (исходном коде) клетки. Для получения " -"информации о настройке клетки см. extref:{handbook} jails/[раздел о клетках " +"информации о настройке клетки см. extref:{handbook}jails[раздел о клетках " "Руководства FreeBSD, jails-synopsis]." #. type: Title == @@ -127,8 +127,8 @@ "usr/include/sys/jail.h#." msgstr "" "В файле [.filename]#jail.c# первое, на что я бы обратил внимание, это " -"объявление важной структуры `struct jail j;`, которая была включена из " -"[.filename]#/usr/include/sys/jail.h#." +"объявление важной структуры `struct jail j;`, которая была включена из [." +"filename]#/usr/include/sys/jail.h#." #. type: Plain text #: documentation/content/en/books/arch-handbook/jail/_index.adoc:69 @@ -320,8 +320,7 @@ #. type: Plain text #: documentation/content/en/books/arch-handbook/jail/_index.adoc:137 msgid "In [.filename]#kern_jail.c#, the following sysctls are defined:" -msgstr "" -"В файле [.filename]#kern_jail.c# определены следующие параметры sysctl:" +msgstr "В файле [.filename]#kern_jail.c# определены следующие параметры sysctl:" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/jail/_index.adoc:145 @@ -351,7 +350,8 @@ "int jail_socket_unixiproute_only = 1;\n" "SYSCTL_INT(_security_jail, OID_AUTO, socket_unixiproute_only, CTLFLAG_RW,\n" " &jail_socket_unixiproute_only, 0,\n" -" \"Processes in jail are limited to creating UNIX/IPv4/route sockets only\");\n" +" \"Processes in jail are limited to creating UNIX/IPv4/route sockets " +"only\");\n" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/jail/_index.adoc:155 @@ -433,8 +433,8 @@ msgstr "" "Каждый из этих параметров sysctl может быть доступен пользователю через " "программу man:sysctl[8]. В ядре эти конкретные параметры sysctl распознаются " -"по их именам. Например, имя первого параметра sysctl — " -"`security.jail.set_hostname_allowed`." +"по их именам. Например, имя первого параметра sysctl — `security.jail." +"set_hostname_allowed`." #. type: Title ==== #: documentation/content/en/books/arch-handbook/jail/_index.adoc:179 @@ -457,8 +457,8 @@ "аргумента: `struct thread *td` и `struct jail_args *uap`. `td` — это " "указатель на структуру `thread`, которая описывает вызывающий поток. В " "данном контексте `uap` — это указатель на структуру, в которой содержится " -"указатель на структуру `jail`, переданную из пользовательского пространства " -"[.filename]#jail.c#. Ранее, когда я описывал пользовательскую программу, вы " +"указатель на структуру `jail`, переданную из пользовательского пространства [" +".filename]#jail.c#. Ранее, когда я описывал пользовательскую программу, вы " "видели, что системному вызову man:jail[2] была передана структура `jail` в " "качестве собственного аргумента." @@ -495,14 +495,14 @@ "`jail` structure pointed by `uap->jail` is copied into kernel space and is " "stored in another `jail` structure, `j`." msgstr "" -"Следовательно, `uap->jail` можно использовать для доступа к структуре " -"`jail`, которая была передана системному вызову. Далее системный вызов " -"копирует структуру `клетка` в пространство ядра с помощью функции " -"man:copyin[9]. man:copyin[9] принимает три аргумента: адрес данных, которые " -"нужно скопировать в пространство ядра (`uap->jail`), место для записи данных " -"(`j`) и размер хранилища. Структура `jail`, на которую указывает `uap-" -">jail`, копируется в пространство ядра и сохраняется в другой структуре " -"`клетка` — `j`." +"Следовательно, `uap->jail` можно использовать для доступа к структуре `jail`" +", которая была передана системному вызову. Далее системный вызов копирует " +"структуру `клетка` в пространство ядра с помощью функции man:copyin[9]. " +"man:copyin[9] принимает три аргумента: адрес данных, которые нужно " +"скопировать в пространство ядра (`uap->jail`), место для записи данных (`j`) " +"и размер хранилища. Структура `jail`, на которую указывает `uap->jail`, " +"копируется в пространство ядра и сохраняется в другой структуре `клетка` — " +"`j`." #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/jail/_index.adoc:201 @@ -547,18 +547,26 @@ msgstr "" "/usr/include/sys/jail.h:\n" "struct prison {\n" -" LIST_ENTRY(prison) pr_list; /* (a) all prisons */\n" +" LIST_ENTRY(prison) pr_list; /* (a) all prisons */" +"\n" " int pr_id; /* (c) prison id */\n" " int pr_ref; /* (p) refcount */\n" -" char pr_path[MAXPATHLEN]; /* (c) chroot path */\n" -" struct vnode *pr_root; /* (c) vnode to rdir */\n" -" char pr_host[MAXHOSTNAMELEN]; /* (p) jail hostname */\n" -" u_int32_t pr_ip; /* (c) ip addr host */\n" +" char pr_path[MAXPATHLEN]; /* (c) chroot path */" +"\n" +" struct vnode *pr_root; /* (c) vnode to rdir " +"*/\n" +" char pr_host[MAXHOSTNAMELEN]; /* (p) jail hostname " +"*/\n" +" u_int32_t pr_ip; /* (c) ip addr host " +"*/\n" " void *pr_linux; /* (p) linux abi */\n" -" int pr_securelevel; /* (p) securelevel */\n" -" struct task pr_task; /* (d) destroy task */\n" +" int pr_securelevel; /* (p) securelevel */" +"\n" +" struct task pr_task; /* (d) destroy task " +"*/\n" " struct mtx pr_mtx;\n" -" void **pr_slots; /* (p) additional data */\n" +" void **pr_slots; /* (p) additional data " +"*/\n" "};\n" #. type: Plain text @@ -736,11 +744,11 @@ "в клетке. Когда в ядре вызывается функция `jailed()` с вновь созданной " "структурой `ucred` в качестве аргумента, она возвращает 1, указывая, что " "учётные данные связаны с клеткой. Общим родительским процессом для всех " -"процессов, созданных внутри клетки, является процесс, запускающий " -"man:jail[8], так как он вызывает системный вызов man:jail[2]. При выполнении " -"программы через man:execve[2] она наследует свойство клетки из структуры " -"`ucred` родительского процесса, следовательно, у нее структура `ucred` тоже " -"со свойством клетки." +"процессов, созданных внутри клетки, является процесс, запускающий man:jail[8]" +", так как он вызывает системный вызов man:jail[2]. При выполнении программы " +"через man:execve[2] она наследует свойство клетки из структуры `ucred` " +"родительского процесса, следовательно, у нее структура `ucred` тоже со " +"свойством клетки." #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/jail/_index.adoc:296 @@ -988,8 +996,8 @@ "`semctl(semid, semnum, cmd, ...)`: `semctl` does the specified `cmd` on the " "semaphore queue indicated by `semid`." msgstr "" -"`semctl(semid, semnum, cmd, ...)`: `semctl` выполняет указанную команду " -"`cmd` для очереди семафоров, указанной в `semid`." +"`semctl(semid, semnum, cmd, ...)`: `semctl` выполняет указанную команду `cmd`" +" для очереди семафоров, указанной в `semid`." #. type: Plain text #: documentation/content/en/books/arch-handbook/jail/_index.adoc:363 @@ -1088,10 +1096,10 @@ msgstr "" "Клетка обрабатывает системный вызов man:socket[2] и связанные низкоуровневые " "функции сокетов особым образом. Для определения, разрешено ли создание " -"определённого сокета, сначала проверяется значение sysctl " -"`security.jail.socket_unixiproute_only`. Если оно установлено, сокеты " -"разрешено создавать только в случае, если указанное семейство равно " -"`PF_LOCAL`, `PF_INET` или `PF_ROUTE`. В противном случае возвращается ошибка." +"определённого сокета, сначала проверяется значение sysctl `security.jail." +"socket_unixiproute_only`. Если оно установлено, сокеты разрешено создавать " +"только в случае, если указанное семейство равно `PF_LOCAL`, `PF_INET` или " +"`PF_ROUTE`. В противном случае возвращается ошибка." #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/jail/_index.adoc:397 @@ -1224,7 +1232,8 @@ msgstr "" "/usr/src/sys/netinet/in_pcb.c:\n" "int\n" -"in_pcbbind_setup(struct inpcb *inp, struct sockaddr *nam, in_addr_t *laddrp,\n" +"in_pcbbind_setup(struct inpcb *inp, struct sockaddr *nam, in_addr_t *laddrp," +"\n" " u_short *lportp, struct ucred *cred)\n" "{\n" " ...\n" @@ -1268,8 +1277,8 @@ "that address." msgstr "" "Вы можете задаться вопросом, какую функцию выполняет `prison_ip()`. " -"`prison_ip()` принимает три аргумента: указатель на учетные данные " -"(представленные как `cred`), любые флаги и IP-адрес. Она возвращает 1, если " +"`prison_ip()` принимает три аргумента: указатель на учетные данные (" +"представленные как `cred`), любые флаги и IP-адрес. Она возвращает 1, если " "IP-адрес НЕ принадлежит клетке, и 0 в противном случае. Как видно из кода, " "если это действительно IP-адрес, не принадлежащий клетке, протоколу не " "разрешается привязываться к этому адресу." diff --git a/documentation/content/ru/books/arch-handbook/kobj/_index.adoc b/documentation/content/ru/books/arch-handbook/kobj/_index.adoc --- a/documentation/content/ru/books/arch-handbook/kobj/_index.adoc +++ b/documentation/content/ru/books/arch-handbook/kobj/_index.adoc @@ -4,7 +4,7 @@ params: path: /books/arch-handbook/kobj/ prev: books/arch-handbook/locking -showBookMenu: true +showBookMenu: 'true' tags: ["kernel objects", "kobj", "guide", "FreeBSD"] title: 'Глава 3. Объекты ядра' weight: 4 diff --git a/documentation/content/ru/books/arch-handbook/kobj/_index.po b/documentation/content/ru/books/arch-handbook/kobj/_index.po --- a/documentation/content/ru/books/arch-handbook/kobj/_index.po +++ b/documentation/content/ru/books/arch-handbook/kobj/_index.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\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 \n" "Language-Team: Russian \n" "Language-Team: Russian \n" "Language-Team: Russian \n" @@ -25,7 +25,7 @@ msgid "The TrustedBSD MAC Framework" msgstr "Фреймворк TrustedBSD MAC" -#. type: Yaml Front Matter Hash Value: title +#. type: YAML Front Matter: title #: documentation/content/en/books/arch-handbook/mac/_index.adoc:1 #, no-wrap msgid "Chapter 6. The TrustedBSD MAC Framework" @@ -108,8 +108,8 @@ "ОГРАНИЧИВАЯСЬ ИМИ, ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ ТОВАРНОЙ ПРИГОДНОСТИ И " "ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ ОТРИЦАЮТСЯ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ " "NETWORKS ASSOCIATES TECHNOLOGY, INC НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ " -"ПРЯМЫЕ, КОСВЕННЫЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ, ШТРАФНЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ " -"(ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ, ЗАТРАТЫ НА ЗАМЕНУ ТОВАРОВ ИЛИ УСЛУГ; " +"ПРЯМЫЕ, КОСВЕННЫЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ, ШТРАФНЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ (" +"ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ, ЗАТРАТЫ НА ЗАМЕНУ ТОВАРОВ ИЛИ УСЛУГ; " "ПОТЕРЮ ИСПОЛЬЗОВАНИЯ, ДАННЫХ ИЛИ ПРИБЫЛИ; ЛИБО ПРЕРЫВАНИЕ БИЗНЕСА), " "ВЫЗВАННЫЕ ЛЮБЫМ ОБРАЗОМ И НА ОСНОВАНИИ ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ, БУДЬ ТО " "В РАМКАХ ДОГОВОРА, СТРОГОЙ ОТВЕТСТВЕННОСТИ ИЛИ ДЕЛИКТА (ВКЛЮЧАЯ НЕБРЕЖНОСТЬ " @@ -228,12 +228,12 @@ "пользователями, и межсетевые экраны. Различные политики MAC были разработаны " "создателями операционных систем и исследователями безопасности, включая " "политику конфиденциальности многоуровневой безопасности (MLS — Multi-Level " -"Security), политику целостности Biba, управление доступом на основе ролей " -"(RBAC — Role-Based Access Control), принудительное применение доменов и " -"типов (DTE — Domain and Type Enforcement) и принудительное применение типов " -"(TE — Type Enforcement). Каждая модель основывает решения на различных " -"факторах, включая идентификатор пользователя, роль и уровень доступа, а " -"также метки безопасности на объектах, представляющих такие концепции, как " +"Security), политику целостности Biba, управление доступом на основе ролей (" +"RBAC — Role-Based Access Control), принудительное применение доменов и типов " +"(DTE — Domain and Type Enforcement) и принудительное применение типов (TE — " +"Type Enforcement). Каждая модель основывает решения на различных факторах, " +"включая идентификатор пользователя, роль и уровень доступа, а также метки " +"безопасности на объектах, представляющих такие концепции, как " "конфиденциальность и целостность данных." #. type: Plain text @@ -676,8 +676,8 @@ "работы модулей политики будут объединены фреймворком с использованием " "оператора композиции. Этот оператор в настоящее время жёстко закодирован и " "требует, чтобы все активные политики одобрили запрос для возврата успешного " -"результата. Поскольку политики могут возвращать различные условия ошибки " -"(успех, доступ запрещён, объект не существует, ...), оператор старшинства " +"результата. Поскольку политики могут возвращать различные условия ошибки (" +"успех, доступ запрещён, объект не существует, ...), оператор старшинства " "выбирает результирующую ошибку из набора ошибок, возвращаемых политиками. В " "общем случае, ошибки, указывающие на то, что объект не существует, будут " "предпочтительнее ошибок, указывающих на запрет доступа к объекту. Хотя не " @@ -710,12 +710,13 @@ "безопасности объектов, MAC Framework предоставляет набор системных вызовов " "для управления метками, не зависящих от политик, охватывающих различные " "объекты, доступные пользователю. Общие типы меток включают идентификаторы " -"разделов, метки конфиденциальности, метки целостности, отделы (compartment), " -"домены, роли и типы. Под \"не зависящими от политик\" подразумевается, что " -"модули политик могут полностью определять семантику метаданных, связанных с " -"объектом. Модули политик участвуют в интернализации и экстернализации " -"строковых меток, предоставляемых пользовательскими приложениями, и могут при " -"необходимости предоставлять приложениям несколько элементов меток." +"разделов, метки конфиденциальности, метки целостности, компартменты " +"(compartment), домены, роли и типы. Под \"не зависящими от политик\" " +"подразумевается, что модули политик могут полностью определять семантику " +"метаданных, связанных с объектом. Модули политик участвуют в интернализации " +"и экстернализации строковых меток, предоставляемых пользовательскими " +"приложениями, и могут при необходимости предоставлять приложениям несколько " +"элементов меток." #. type: Plain text #: documentation/content/en/books/arch-handbook/mac/_index.adoc:216 @@ -915,8 +916,8 @@ "`mac_set_fd()` may be used to request a change in the label of an object " "(file, socket, pipe, ...) referenced by a file descriptor." msgstr "" -"`mac_set_fd()` может использоваться для запроса изменения метки объекта " -"(файл, сокет, канал, ...), на который ссылается файловый дескриптор." +"`mac_set_fd()` может использоваться для запроса изменения метки объекта (" +"файл, сокет, канал, ...), на который ссылается файловый дескриптор." #. type: Plain text #: documentation/content/en/books/arch-handbook/mac/_index.adoc:254 @@ -1127,24 +1128,58 @@ "};\n" #. type: Plain text -#: documentation/content/en/books/arch-handbook/mac/_index.adoc:306 +#: documentation/content/en/books/arch-handbook/mac/_index.adoc:302 msgid "" "The MAC policy entry point vector, `mac__policy__ops` in this example, " "associates functions defined in the module with specific entry points. A " "complete listing of available entry points and their prototypes may be found " "in the MAC entry point reference section. Of specific interest during " -"module registration are the .mpo_destroy and .mpo_init entry " -"points. .mpo_init will be invoked once a policy is successfully registered " -"with the module framework but prior to any other entry points becoming " -"active. This permits the policy to perform any policy-specific allocation " -"and initialization, such as initialization of any data or " -"locks. .mpo_destroy will be invoked when a policy module is unloaded to " -"permit releasing of any allocated memory and destruction of locks. " +"module registration are the .mpo_destroy and .mpo_init entry points." +msgstr "" +"Вектор точек входа политики MAC, `mac__policy__ops` в данном примере, " +"связывает функции, определённые в модуле, с конкретными точками входа. " +"Полный список доступных точек входа и их прототипов можно найти в разделе " +"справочника по точкам входа MAC. Особый интерес при регистрации модуля " +"представляют точки входа .mpo_destroy и .mpo_init." + +#. type: Block title +#: documentation/content/en/books/arch-handbook/mac/_index.adoc:302 +#, no-wrap +msgid "mpo_init will be invoked once a policy is successfully registered with the module framework but prior to any other entry points becoming active." +msgstr "" +"mpo_init будет вызван после успешной регистрации политики в модульной " +"системе, но до активации других точек входа." + +#. type: Plain text +#: documentation/content/en/books/arch-handbook/mac/_index.adoc:304 +msgid "" +"This permits the policy to perform any policy-specific allocation and " +"initialization, such as initialization of any data or locks." +msgstr "" +"Это позволяет политике выполнять любые выделения и инициализации, " +"специфичные для данной политики, такие как инициализация данных или " +"блокировок." + +#. type: Block title +#: documentation/content/en/books/arch-handbook/mac/_index.adoc:304 +#, no-wrap +msgid "mpo_destroy will be invoked when a policy module is unloaded to permit releasing of any allocated memory and destruction of locks." +msgstr "" +"mpo_destroy будет вызван при выгрузке модуля политики для освобождения " +"выделенной памяти и уничтожения блокировок." + +#. type: Plain text +#: documentation/content/en/books/arch-handbook/mac/_index.adoc:306 +msgid "" "Currently, these two entry points are invoked with the MAC policy list mutex " "held to prevent any other entry points from being invoked: this will be " "changed, but in the mean time, policies should be careful about what kernel " "primitives they invoke so as to avoid lock ordering or sleeping problems." msgstr "" +"В настоящее время эти две точки входа вызываются с удержанием мьютекса " +"списка политик MAC, чтобы предотвратить вызов других точек входа: это будет " +"изменено, но до тех пор политики должны быть осторожны с используемыми " +"примитивами ядра, чтобы избежать проблем с порядком блокировок или сном." #. type: Plain text #: documentation/content/en/books/arch-handbook/mac/_index.adoc:310 @@ -2255,9 +2290,9 @@ "long-lived operations. This entry point is permitted to fail resulting in " "the failure to allocate the mbuf header." msgstr "" -"Инициализировать на только что созданном заголовке пакета mbuf метку " -"(`mbuf`). Поле `flag` может принимать одно из значений M_WAITOK или M_NOWAIT " -"и должно использоваться, чтобы избежать выполнения \"спящего\" man:malloc[9] " +"Инициализировать на только что созданном заголовке пакета mbuf метку (`mbuf`)" +". Поле `flag` может принимать одно из значений M_WAITOK или M_NOWAIT и " +"должно использоваться, чтобы избежать выполнения \"спящего\" man:malloc[9] " "во время этого вызова инициализации. Выделение mbuf часто происходит в " "чувствительных к производительности средах, и реализация должна избегать " "\"спящего\" режима или длительных операций. Этой точке входа разрешено " @@ -2273,7 +2308,8 @@ #: documentation/content/en/books/arch-handbook/mac/_index.adoc:631 #, no-wrap msgid "void mpo_init_mount_label(struct label *mntlabel, struct label *fslabel);\n" -msgstr "void mpo_init_mount_label(struct label *mntlabel, struct label *fslabel);\n" +msgstr "" +"void mpo_init_mount_label(struct label *mntlabel, struct label *fslabel);\n" #. type: Table #: documentation/content/en/books/arch-handbook/mac/_index.adoc:641 @@ -2656,7 +2692,9 @@ #: documentation/content/en/books/arch-handbook/mac/_index.adoc:965 #, no-wrap msgid "void mpo_destroy_mount_label(struct label *mntlabel, struct label *fslabel);\n" -msgstr "void mpo_destroy_mount_label(struct label *mntlabel, struct label *fslabel);\n" +msgstr "" +"void mpo_destroy_mount_label(struct label *mntlabel, struct label *fslabel);" +"\n" #. type: Table #: documentation/content/en/books/arch-handbook/mac/_index.adoc:980 @@ -3089,7 +3127,8 @@ "int mpo_externalize_socket_peer_label(struct label *label, char *element_name,\n" " struct sbuf *sb, int *claimed);\n" msgstr "" -"int mpo_externalize_socket_peer_label(struct label *label, char *element_name,\n" +"int mpo_externalize_socket_peer_label(struct label *label, char " +"*element_name,\n" " struct sbuf *sb, int *claimed);\n" #. type: Title ==== @@ -3132,7 +3171,8 @@ #: documentation/content/en/books/arch-handbook/mac/_index.adoc:1589 #, no-wrap msgid "Name of the policy whose label should be internalized" -msgstr "Имя политики, метка которой должна быть приведена к внутреннему представлению" +msgstr "" +"Имя политики, метка которой должна быть приведена к внутреннему представлению" #. type: Table #: documentation/content/en/books/arch-handbook/mac/_index.adoc:1444 @@ -3162,7 +3202,9 @@ #: documentation/content/en/books/arch-handbook/mac/_index.adoc:1597 #, no-wrap msgid "Should be incremented when data can be successfully internalized." -msgstr "Должно увеличиваться, когда данные могут быть успешно преобразовываться вовнутреннее представление." +msgstr "" +"Должно увеличиваться, когда данные могут быть успешно преобразовываться во " +"внутреннее представление." #. type: Plain text #: documentation/content/en/books/arch-handbook/mac/_index.adoc:1455 @@ -3180,7 +3222,7 @@ "match its own name, or when data can successfully be internalized, in which " "case `*claimed` should be incremented." msgstr "" -"Создать внутреннюю структуру меток на основе данных метки вов нешнем " +"Создать внутреннюю структуру меток на основе данных метки во внешнем " "представлении в текстовом формате. В настоящее время, при запросе " "преобразования во внутреннее представление вызываются точки входа " "`internalize` всех политик, поэтому реализация должна сравнивать содержимое " @@ -3360,7 +3402,7 @@ "entry point as a result of the acceptance of an additional mbuf to that " "queue." msgstr "" -"События, привящанные к объектам, обычно не попадают в другие классы событий " +"События, привязанные к объектам, обычно не попадают в другие классы событий " "меток, но, как правило, предоставляют возможность изменить или обновить " "метку объекта на основе дополнительного контекста. Например, метка в очереди " "сборки IP-фрагментов может быть обновлена во время точки входа " @@ -3625,7 +3667,8 @@ "void mpo_associate_vnode_singlelabel(struct mount *mp, struct label *fslabel,\n" " struct vnode *vp, struct label *vlabel);\n" msgstr "" -"void mpo_associate_vnode_singlelabel(struct mount *mp, struct label *fslabel,\n" +"void mpo_associate_vnode_singlelabel(struct mount *mp, struct label *fslabel," +"\n" " struct vnode *vp, struct label *vlabel);\n" #. type: Plain text @@ -3771,7 +3814,8 @@ " struct label *delabel);\n" msgstr "" "void mpo_create_devfs_symlink(struct ucred *cred, struct mount *mp,\n" -" struct devfs_dirent *dd, struct label *ddlabel, struct devfs_dirent *de,\n" +" struct devfs_dirent *dd, struct label *ddlabel, struct devfs_dirent *de," +"\n" " struct label *delabel);\n" #. type: Table @@ -3946,7 +3990,7 @@ #: documentation/content/en/books/arch-handbook/mac/_index.adoc:1859 #, no-wrap msgid "Link destination" -msgstr "Назначения cсылки" +msgstr "Место назначения ссылки" #. type: Table #: documentation/content/en/books/arch-handbook/mac/_index.adoc:1862 @@ -3964,7 +4008,7 @@ #: documentation/content/en/books/arch-handbook/mac/_index.adoc:1867 #, no-wrap msgid "Symlink entry" -msgstr "Символьная ссылка записи" +msgstr "Точка входа символьной ссылки" #. type: Table #: documentation/content/en/books/arch-handbook/mac/_index.adoc:1871 @@ -4098,7 +4142,8 @@ "void mpo_create_mount(struct ucred *cred, struct mount *mp, struct label *mnt,\n" " struct label *fslabel);\n" msgstr "" -"void mpo_create_mount(struct ucred *cred, struct mount *mp, struct label *mnt,\n" +"void mpo_create_mount(struct ucred *cred, struct mount *mp, struct label " +"*mnt,\n" " struct label *fslabel);\n" #. type: Table @@ -4383,7 +4428,8 @@ "void mpo_create_mbuf_from_socket(struct socket *so, struct label *socketlabel,\n" " struct mbuf *m, struct label *mbuflabel);\n" msgstr "" -"void mpo_create_mbuf_from_socket(struct socket *so, struct label *socketlabel,\n" +"void mpo_create_mbuf_from_socket(struct socket *so, struct label " +"*socketlabel,\n" " struct mbuf *m, struct label *mbuflabel);\n" #. type: Table @@ -4789,7 +4835,8 @@ "void mpo_set_socket_peer_from_mbuf(struct mbuf *mbuf, struct label *mbuflabel,\n" " struct label *oldlabel, struct label *newlabel);\n" msgstr "" -"void mpo_set_socket_peer_from_mbuf(struct mbuf *mbuf, struct label *mbuflabel,\n" +"void mpo_set_socket_peer_from_mbuf(struct mbuf *mbuf, struct label " +"*mbuflabel,\n" " struct label *oldlabel, struct label *newlabel);\n" #. type: Table @@ -5084,7 +5131,7 @@ #: documentation/content/en/books/arch-handbook/mac/_index.adoc:2466 #, no-wrap msgid "IP reassembly queue to be labeled" -msgstr "Очередь повторной сборки IP, которой добавляетя метка" +msgstr "Очередь повторной сборки IP, которой добавляется метка" #. type: Table #: documentation/content/en/books/arch-handbook/mac/_index.adoc:2469 @@ -5124,7 +5171,8 @@ " struct label *ipqlabel, struct mbuf *datagram, struct label *datagramlabel);\n" msgstr "" "void mpo_create_create_datagram_from_ipq(struct ipq *ipq,\n" -" struct label *ipqlabel, struct mbuf *datagram, struct label *datagramlabel);\n" +" struct label *ipqlabel, struct mbuf *datagram, struct label " +"*datagramlabel);\n" #. type: Table #: documentation/content/en/books/arch-handbook/mac/_index.adoc:2493 @@ -5187,7 +5235,8 @@ "void mpo_create_fragment(struct mbuf *datagram, struct label *datagramlabel,\n" " struct mbuf *fragment, struct label *fragmentlabel);\n" msgstr "" -"void mpo_create_fragment(struct mbuf *datagram, struct label *datagramlabel,\n" +"void mpo_create_fragment(struct mbuf *datagram, struct label *datagramlabel," +"\n" " struct mbuf *fragment, struct label *fragmentlabel);\n" #. type: Table @@ -5236,7 +5285,8 @@ "void mpo_create_mbuf_from_mbuf(struct mbuf *oldmbuf, struct label *oldmbuflabel,\n" " struct mbuf *newmbuf, struct label *newmbuflabel);\n" msgstr "" -"void mpo_create_mbuf_from_mbuf(struct mbuf *oldmbuf, struct label *oldmbuflabel,\n" +"void mpo_create_mbuf_from_mbuf(struct mbuf *oldmbuf, struct label " +"*oldmbuflabel,\n" " struct mbuf *newmbuf, struct label *newmbuflabel);\n" #. type: Table @@ -5324,7 +5374,8 @@ "void mpo_create_mbuf_linklayer(struct ifnet *ifnet, struct label *ifnetlabel,\n" " struct mbuf *mbuf, struct label *mbuflabel);\n" msgstr "" -"void mpo_create_mbuf_linklayer(struct ifnet *ifnet, struct label *ifnetlabel,\n" +"void mpo_create_mbuf_linklayer(struct ifnet *ifnet, struct label *ifnetlabel," +"\n" " struct mbuf *mbuf, struct label *mbuflabel);\n" #. type: Table @@ -5378,7 +5429,8 @@ "void mpo_create_mbuf_from_bpfdesc(struct bpf_d *bpf_d, struct label *bpflabel,\n" " struct mbuf *mbuf, struct label *mbuflabel);\n" msgstr "" -"void mpo_create_mbuf_from_bpfdesc(struct bpf_d *bpf_d, struct label *bpflabel,\n" +"void mpo_create_mbuf_from_bpfdesc(struct bpf_d *bpf_d, struct label " +"*bpflabel,\n" " struct mbuf *mbuf, struct label *mbuflabel);\n" #. type: Table @@ -5431,7 +5483,8 @@ "void mpo_create_mbuf_from_ifnet(struct ifnet *ifnet, struct label *ifnetlabel,\n" " struct mbuf *mbuf, struct label *mbuflabel);\n" msgstr "" -"void mpo_create_mbuf_from_ifnet(struct ifnet *ifnet, struct label *ifnetlabel,\n" +"void mpo_create_mbuf_from_ifnet(struct ifnet *ifnet, struct label " +"*ifnetlabel,\n" " struct mbuf *mbuf, struct label *mbuflabel);\n" #. type: Table @@ -5464,7 +5517,8 @@ " struct mbuf *newmbuf, struct label *newmbuflabel);\n" msgstr "" "void mpo_create_mbuf_multicast_encap(struct mbuf *oldmbuf,\n" -" struct label *oldmbuflabel, struct ifnet *ifnet, struct label *ifnetlabel,\n" +" struct label *oldmbuflabel, struct ifnet *ifnet, struct label " +"*ifnetlabel,\n" " struct mbuf *newmbuf, struct label *newmbuflabel);\n" #. type: Table @@ -5505,7 +5559,8 @@ "void mpo_create_mbuf_netlayer(struct mbuf *oldmbuf, struct label *oldmbuflabel,\n" " struct mbuf *newmbuf, struct label *newmbuflabel);\n" msgstr "" -"void mpo_create_mbuf_netlayer(struct mbuf *oldmbuf, struct label *oldmbuflabel,\n" +"void mpo_create_mbuf_netlayer(struct mbuf *oldmbuf, struct label " +"*oldmbuflabel,\n" " struct mbuf *newmbuf, struct label *newmbuflabel);\n" #. type: Table @@ -5689,7 +5744,8 @@ #: documentation/content/en/books/arch-handbook/mac/_index.adoc:2886 #, no-wrap msgid "void mpo_create_cred(struct ucred *parent_cred, struct ucred *child_cred);\n" -msgstr "void mpo_create_cred(struct ucred *parent_cred, struct ucred *child_cred);\n" +msgstr "" +"void mpo_create_cred(struct ucred *parent_cred, struct ucred *child_cred);\n" #. type: Table #: documentation/content/en/books/arch-handbook/mac/_index.adoc:2896 @@ -6072,8 +6128,8 @@ "Determine whether the subject should be allowed to retrieve the kernel " "environment (see man:kenv[2])." msgstr "" -"Определить, следует ли разрешить субъекту получать доступ к окружению ядра " -"(см. man:kenv[2])." +"Определить, следует ли разрешить субъекту получать доступ к окружению ядра (" +"см. man:kenv[2])." #. type: Title ==== #: documentation/content/en/books/arch-handbook/mac/_index.adoc:3142 @@ -6674,7 +6730,8 @@ #: documentation/content/en/books/arch-handbook/mac/_index.adoc:3758 #, no-wrap msgid "int mpo_check_cred_relabel(struct ucred *cred, struct label *newlabel);\n" -msgstr "int mpo_check_cred_relabel(struct ucred *cred, struct label *newlabel);\n" +msgstr "" +"int mpo_check_cred_relabel(struct ucred *cred, struct label *newlabel);\n" #. type: Table #: documentation/content/en/books/arch-handbook/mac/_index.adoc:3773 @@ -6883,10 +6940,9 @@ "Определить, как должны возвращаться вызовы man:access[2] и связанные вызовы " "для субъекта с указанными учетными данными при выполнении на переданном " "vnode с использованием переданных флагов доступа. Обычно это должно быть " -"реализовано с использованием той же семантики, что и в " -"`mpo_check_vnode_open`. Возвращает 0 при успехе или значение `errno` при " -"ошибке. Рекомендуемые ошибки: EACCES при несоответствии меток или EPERM при " -"отсутствии привилегий." +"реализовано с использованием той же семантики, что и в `mpo_check_vnode_open`" +". Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые " +"ошибки: EACCES при несоответствии меток или EPERM при отсутствии привилегий." #. type: Title ==== #: documentation/content/en/books/arch-handbook/mac/_index.adoc:3915 @@ -7197,7 +7253,8 @@ " struct label *label, int attrnamespace, const char *name, struct uio *uio);\n" msgstr "" "int mpo_check_vnode_getextattr(struct ucred *cred, struct vnode *vp,\n" -" struct label *label, int attrnamespace, const char *name, struct uio *uio);\n" +" struct label *label, int attrnamespace, const char *name, struct uio " +"*uio);\n" #. type: Table #: documentation/content/en/books/arch-handbook/mac/_index.adoc:4205 @@ -7418,7 +7475,8 @@ "int mpo_check_vnode_poll(struct ucred *active_cred, struct ucred *file_cred,\n" " struct vnode *vp, struct label *label);\n" msgstr "" -"int mpo_check_vnode_poll(struct ucred *active_cred, struct ucred *file_cred,\n" +"int mpo_check_vnode_poll(struct ucred *active_cred, struct ucred *file_cred," +"\n" " struct vnode *vp, struct label *label);\n" #. type: Table @@ -7498,7 +7556,8 @@ " struct componentname *cnp);\n" msgstr "" "int mpo_check_vnode_rename_to(struct ucred *cred, struct vnode *dvp,\n" -" struct label *dlabel, struct vnode *vp, struct label *label, int samedir,\n" +" struct label *dlabel, struct vnode *vp, struct label *label, int samedir," +"\n" " struct componentname *cnp);\n" #. type: Table @@ -7559,8 +7618,8 @@ "Return 0 for success, or an `errno` value for failure. Suggested failure: " "EACCES for label mismatch, or EPERM for lack of privilege." msgstr "" -"Определить, могут ли учётные данные субъекта прослушивать переданный сокет " -"(вызывать listen). Возвращает 0 при успехе или значение `errno` при ошибке. " +"Определить, могут ли учётные данные субъекта прослушивать переданный сокет (" +"вызывать listen). Возвращает 0 при успехе или значение `errno` при ошибке. " "Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при " "отсутствии привилегий." @@ -7791,7 +7850,8 @@ " struct label *label, int attrnamespace, const char *name, struct uio *uio);\n" msgstr "" "int mpo_check_vnode_setextattr(struct ucred *cred, struct vnode *vp,\n" -" struct label *label, int attrnamespace, const char *name, struct uio *uio);\n" +" struct label *label, int attrnamespace, const char *name, struct uio " +"*uio);\n" #. type: Plain text #: documentation/content/en/books/arch-handbook/mac/_index.adoc:4790 @@ -8046,7 +8106,9 @@ #: documentation/content/en/books/arch-handbook/mac/_index.adoc:4984 #, no-wrap msgid "int mpo_check_proc_signal(struct ucred *cred, struct proc *proc, int signal);\n" -msgstr "int mpo_check_proc_signal(struct ucred *cred, struct proc *proc, int signal);\n" +msgstr "" +"int mpo_check_proc_signal(struct ucred *cred, struct proc *proc, int signal);" +"\n" #. type: Table #: documentation/content/en/books/arch-handbook/mac/_index.adoc:5002 @@ -8594,46 +8656,3 @@ "на существующих учетных данных BSD или защите файлов. Авторам политик может " "быть полезно ознакомиться с этой документацией, а также с существующими " "модулями безопасности при реализации новой службы безопасности." - -#~ msgid "" -#~ "The MAC policy entry point vector, `mac__policy__ops` in this example, " -#~ "associates functions defined in the module with specific entry points. A " -#~ "complete listing of available entry points and their prototypes may be " -#~ "found in the MAC entry point reference section. Of specific interest " -#~ "during module registration are the .mpo_destroy and .mpo_init entry " -#~ "points." -#~ msgstr "" -#~ "Вектор точек входа политики MAC, `mac__policy__ops` в данном примере, " -#~ "связывает функции, определённые в модуле, с конкретными точками входа. " -#~ "Полный список доступных точек входа и их прототипов можно найти в разделе " -#~ "справочника по точкам входа MAC. Особый интерес при регистрации модуля " -#~ "представляют точки входа .mpo_destroy и .mpo_init." - -#, no-wrap -#~ msgid "mpo_init will be invoked once a policy is successfully registered with the module framework but prior to any other entry points becoming active." -#~ msgstr "mpo_init будет вызван после успешной регистрации политики в модульной системе, но до активации других точек входа." - -#~ msgid "" -#~ "This permits the policy to perform any policy-specific allocation and " -#~ "initialization, such as initialization of any data or locks." -#~ msgstr "" -#~ "Это позволяет политике выполнять любые выделения и инициализации, " -#~ "специфичные для данной политики, такие как инициализация данных или " -#~ "блокировок." - -#, no-wrap -#~ msgid "mpo_destroy will be invoked when a policy module is unloaded to permit releasing of any allocated memory and destruction of locks." -#~ msgstr "mpo_destroy будет вызван при выгрузке модуля политики для освобождения выделенной памяти и уничтожения блокировок." - -#~ msgid "" -#~ "Currently, these two entry points are invoked with the MAC policy list " -#~ "mutex held to prevent any other entry points from being invoked: this " -#~ "will be changed, but in the mean time, policies should be careful about " -#~ "what kernel primitives they invoke so as to avoid lock ordering or " -#~ "sleeping problems." -#~ msgstr "" -#~ "В настоящее время эти две точки входа вызываются с удержанием мьютекса " -#~ "списка политик MAC, чтобы предотвратить вызов других точек входа: это " -#~ "будет изменено, но до тех пор политики должны быть осторожны с " -#~ "используемыми примитивами ядра, чтобы избежать проблем с порядком " -#~ "блокировок или сном." diff --git a/documentation/content/ru/books/arch-handbook/newbus/_index.adoc b/documentation/content/ru/books/arch-handbook/newbus/_index.adoc --- a/documentation/content/ru/books/arch-handbook/newbus/_index.adoc +++ b/documentation/content/ru/books/arch-handbook/newbus/_index.adoc @@ -11,7 +11,7 @@ params: path: /books/arch-handbook/newbus/ prev: books/arch-handbook/usb -showBookMenu: true +showBookMenu: 'true' tags: ["Newbus", "overview", "API"] title: 'Глава 14. Newbus' weight: 16 @@ -187,7 +187,7 @@ `driver_t` - Это определение типа, которое ссылается на `struct driver`. Структура `driver` является классом объекта ядра `device`; она также содержит данные, приватные для драйвера. -*_driver_t_ Implementation* +* Реализация _driver_t_* [.programlisting] .... struct driver { @@ -198,7 +198,7 @@ Тип `device_state_t`, который является перечислением, `device_state`. Он содержит возможные состояния устройства Newbus до и после процесса автонастройки. -*Device States _device_state_t* +*Состояния устройств _device_state_t* [.programlisting] .... /* diff --git a/documentation/content/ru/books/arch-handbook/newbus/_index.po b/documentation/content/ru/books/arch-handbook/newbus/_index.po --- a/documentation/content/ru/books/arch-handbook/newbus/_index.po +++ b/documentation/content/ru/books/arch-handbook/newbus/_index.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\n" +"POT-Creation-Date: 2025-05-01 19:56-0300\n" "PO-Revision-Date: 2025-07-05 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian \n" "Language-Team: Russian =20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" -#. type: Yaml Front Matter Hash Value: title +#. type: YAML Front Matter: title #: documentation/content/en/books/arch-handbook/parti.adoc:1 #, no-wrap msgid "Part I. Kernel" diff --git a/documentation/content/ru/books/arch-handbook/partii.adoc b/documentation/content/ru/books/arch-handbook/partii.adoc --- a/documentation/content/ru/books/arch-handbook/partii.adoc +++ b/documentation/content/ru/books/arch-handbook/partii.adoc @@ -3,7 +3,7 @@ params: path: /books/arch-handbook/partii/ prev: books/arch-handbook/smp -showBookMenu: true +showBookMenu: 'true' title: 'Глава II. Драйверы устройств' weight: 10 --- diff --git a/documentation/content/ru/books/arch-handbook/partii.po b/documentation/content/ru/books/arch-handbook/partii.po --- a/documentation/content/ru/books/arch-handbook/partii.po +++ b/documentation/content/ru/books/arch-handbook/partii.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\n" +"POT-Creation-Date: 2025-05-01 19:56-0300\n" "PO-Revision-Date: 2025-05-29 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian =20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" -#. type: Yaml Front Matter Hash Value: title +#. type: YAML Front Matter: title #: documentation/content/en/books/arch-handbook/partii.adoc:1 #, no-wrap msgid "Part II. Device Drivers" diff --git a/documentation/content/ru/books/arch-handbook/partiii.adoc b/documentation/content/ru/books/arch-handbook/partiii.adoc --- a/documentation/content/ru/books/arch-handbook/partiii.adoc +++ b/documentation/content/ru/books/arch-handbook/partiii.adoc @@ -3,7 +3,7 @@ params: path: /books/arch-handbook/partiii/ prev: books/arch-handbook/pccard -showBookMenu: true +showBookMenu: 'true' title: 'Глава III. Приложения' weight: 19 --- diff --git a/documentation/content/ru/books/arch-handbook/partiii.po b/documentation/content/ru/books/arch-handbook/partiii.po --- a/documentation/content/ru/books/arch-handbook/partiii.po +++ b/documentation/content/ru/books/arch-handbook/partiii.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\n" +"POT-Creation-Date: 2025-05-01 19:56-0300\n" "PO-Revision-Date: 2025-05-29 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian =20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" -#. type: Yaml Front Matter Hash Value: title +#. type: YAML Front Matter: title #: documentation/content/en/books/arch-handbook/partiii.adoc:1 #, no-wrap msgid "Part III. Appendices" diff --git a/documentation/content/ru/books/arch-handbook/pccard/_index.adoc b/documentation/content/ru/books/arch-handbook/pccard/_index.adoc --- a/documentation/content/ru/books/arch-handbook/pccard/_index.adoc +++ b/documentation/content/ru/books/arch-handbook/pccard/_index.adoc @@ -4,7 +4,7 @@ params: path: /books/arch-handbook/pccard/ prev: books/arch-handbook/sound -showBookMenu: true +showBookMenu: 'true' tags: ["pc card", "overview"] title: 'Глава 16. PC Card' weight: 18 diff --git a/documentation/content/ru/books/arch-handbook/pccard/_index.po b/documentation/content/ru/books/arch-handbook/pccard/_index.po --- a/documentation/content/ru/books/arch-handbook/pccard/_index.po +++ b/documentation/content/ru/books/arch-handbook/pccard/_index.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\n" +"POT-Creation-Date: 2025-05-01 19:56-0300\n" "PO-Revision-Date: 2025-09-05 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian \n" "Language-Team: Russian \t\t/* cdevsw struct */\n" "#include \t\t/* uio struct */\n" "#include \n" -"#include \t\t/* structs, prototypes for pci bus stuff and DEVMETHOD macros! */\n" +"#include \t\t/* structs, prototypes for pci bus stuff and " +"DEVMETHOD macros! */\n" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/pci/_index.adoc:81 @@ -226,7 +227,8 @@ msgstr "" "\t/* Look up our softc. */\n" "\tsc = dev->si_drv1;\n" -"\tdevice_printf(sc->my_dev, \"Opened successfully.\\n\");\n" +"\tdevice_printf(sc->my_dev, \"Opened successfully.\\n" +"\");\n" "\treturn (0);\n" "}\n" @@ -256,7 +258,8 @@ msgstr "" "\t/* Look up our softc. */\n" "\tsc = dev->si_drv1;\n" -"\tdevice_printf(sc->my_dev, \"Closed.\\n\");\n" +"\tdevice_printf(sc->my_dev, \"Closed.\\n" +"\");\n" "\treturn (0);\n" "}\n" @@ -286,7 +289,8 @@ msgstr "" "\t/* Look up our softc. */\n" "\tsc = dev->si_drv1;\n" -"\tdevice_printf(sc->my_dev, \"Asked to read %zd bytes.\\n\", uio->uio_resid);\n" +"\tdevice_printf(sc->my_dev, \"Asked to read %zd bytes.\\n" +"\", uio->uio_resid);\n" "\treturn (0);\n" "}\n" @@ -316,7 +320,8 @@ msgstr "" "\t/* Look up our softc. */\n" "\tsc = dev->si_drv1;\n" -"\tdevice_printf(sc->my_dev, \"Asked to write %zd bytes.\\n\", uio->uio_resid);\n" +"\tdevice_printf(sc->my_dev, \"Asked to write %zd bytes.\\n" +"\", uio->uio_resid);\n" "\treturn (0);\n" "}\n" @@ -353,7 +358,10 @@ "\tdevice_printf(dev, \"MyPCI Probe\\nVendor ID : 0x%x\\nDevice ID : 0x%x\\n\",\n" "\t pci_get_vendor(dev), pci_get_device(dev));\n" msgstr "" -"\tdevice_printf(dev, \"MyPCI Probe\\nVendor ID : 0x%x\\nDevice ID : 0x%x\\n\",\n" +"\tdevice_printf(dev, \"MyPCI Probe\\n" +"Vendor ID : 0x%x\\n" +"Device ID : 0x%x\\n" +"\",\n" "\t pci_get_vendor(dev), pci_get_device(dev));\n" #. type: delimited block . 4 @@ -369,7 +377,8 @@ "}\n" msgstr "" "\tif (pci_get_vendor(dev) == 0x11c1) {\n" -"\t\tprintf(\"We've got the Winmodem, probe successful!\\n\");\n" +"\t\tprintf(\"We've got the Winmodem, probe successful!\\n" +"\");\n" "\t\tdevice_set_desc(dev, \"WinModem\");\n" "\t\treturn (BUS_PROBE_DEFAULT);\n" "\t}\n" @@ -400,7 +409,9 @@ #: documentation/content/en/books/arch-handbook/pci/_index.adoc:187 #, no-wrap msgid "\tprintf(\"MyPCI Attach for : deviceID : 0x%x\\n\", pci_get_devid(dev));\n" -msgstr "\tprintf(\"MyPCI Attach for : deviceID : 0x%x\\n\", pci_get_devid(dev));\n" +msgstr "" +"\tprintf(\"MyPCI Attach for : deviceID : 0x%x\\n" +"\", pci_get_devid(dev));\n" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/pci/_index.adoc:191 @@ -440,7 +451,8 @@ "\tsc->my_cdev = make_dev(&mypci_cdevsw, device_get_unit(dev),\n" "\t UID_ROOT, GID_WHEEL, 0600, \"mypci%u\", device_get_unit(dev));\n" "\tsc->my_cdev->si_drv1 = sc;\n" -"\tprintf(\"Mypci device loaded.\\n\");\n" +"\tprintf(\"Mypci device loaded.\\n" +"\");\n" "\treturn (0);\n" "}\n" @@ -478,7 +490,8 @@ "\t/* Teardown the state in our softc created in our attach routine. */\n" "\tsc = device_get_softc(dev);\n" "\tdestroy_dev(sc->my_cdev);\n" -"\tprintf(\"Mypci detach!\\n\");\n" +"\tprintf(\"Mypci detach!\\n" +"\");\n" "\treturn (0);\n" "}\n" @@ -508,7 +521,8 @@ "\treturn (0);\n" "}\n" msgstr "" -"\tprintf(\"Mypci shutdown!\\n\");\n" +"\tprintf(\"Mypci shutdown!\\n" +"\");\n" "\treturn (0);\n" "}\n" @@ -538,7 +552,8 @@ "\treturn (0);\n" "}\n" msgstr "" -"\tprintf(\"Mypci suspend!\\n\");\n" +"\tprintf(\"Mypci suspend!\\n" +"\");\n" "\treturn (0);\n" "}\n" @@ -568,7 +583,8 @@ "\treturn (0);\n" "}\n" msgstr "" -"\tprintf(\"Mypci resume!\\n\");\n" +"\tprintf(\"Mypci resume!\\n" +"\");\n" "\treturn (0);\n" "}\n" @@ -617,7 +633,8 @@ "DEFINE_CLASS_0(mypci, mypci_driver, mypci_methods, sizeof(struct mypci_softc));\n" "DRIVER_MODULE(mypci, pci, mypci_driver, mypci_devclass, 0, 0);\n" msgstr "" -"DEFINE_CLASS_0(mypci, mypci_driver, mypci_methods, sizeof(struct mypci_softc));\n" +"DEFINE_CLASS_0(mypci, mypci_driver, mypci_methods, sizeof(struct " +"mypci_softc));\n" "DRIVER_MODULE(mypci, pci, mypci_driver, mypci_devclass, 0, 0);\n" #. type: Title === @@ -744,7 +761,8 @@ " sc->bar0res = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->bar0id,\n" "\t\t\t\t 0, ~0, 1, RF_ACTIVE);\n" " if (sc->bar0res == NULL) {\n" -" printf(\"Memory allocation of PCI base register 0 failed!\\n\");\n" +" printf(\"Memory allocation of PCI base register 0 failed!\\n" +"\");\n" " error = ENXIO;\n" " goto fail1;\n" " }\n" @@ -770,7 +788,8 @@ " sc->bar1res = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->bar1id,\n" "\t\t\t\t 0, ~0, 1, RF_ACTIVE);\n" " if (sc->bar1res == NULL) {\n" -" printf(\"Memory allocation of PCI base register 1 failed!\\n\");\n" +" printf(\"Memory allocation of PCI base register 1 failed!\\n" +"\");\n" " error = ENXIO;\n" " goto fail2;\n" " }\n" @@ -785,9 +804,8 @@ "Handles for each base address register are kept in the `softc` structure so " "that they can be used to write to the device later." msgstr "" -"Дескрипторы для каждого регистра базовых адресов хранятся в структуре " -"`softc`, чтобы их можно было использовать для записи на устройство в " -"дальнейшем." +"Дескрипторы для каждого регистра базовых адресов хранятся в структуре `softc`" +", чтобы их можно было использовать для записи на устройство в дальнейшем." #. type: Plain text #: documentation/content/en/books/arch-handbook/pci/_index.adoc:328 @@ -926,7 +944,8 @@ " sc->irqres = bus_alloc_resource(dev, SYS_RES_IRQ, &(sc->irqid),\n" "\t\t\t\t 0, ~0, 1, RF_SHAREABLE | RF_ACTIVE);\n" " if (sc->irqres == NULL) {\n" -"\tprintf(\"IRQ allocation failed!\\n\");\n" +"\tprintf(\"IRQ allocation failed!\\n" +"\");\n" "\terror = ENXIO;\n" "\tgoto fail3;\n" " }\n" @@ -951,7 +970,8 @@ " error = bus_setup_intr(dev, sc->irqres, INTR_TYPE_MISC,\n" "\t\t\t my_handler, sc, &(sc->handler));\n" " if (error) {\n" -"\tprintf(\"Couldn't set up irq\\n\");\n" +"\tprintf(\"Couldn't set up irq\\n" +"\");\n" "\tgoto fail4;\n" " }\n" @@ -1065,7 +1085,7 @@ "on a failure condition so that the system will remain usable while your " "driver dies." msgstr "" -"Очень важно освободить все ресурсы, которые были выделены во время " -"`attach()`. Необходимо внимательно следить за освобождением правильных " -"ресурсов даже в случае ошибки, чтобы система оставалась работоспособной при " -"завершении работы вашего драйвера." +"Очень важно освободить все ресурсы, которые были выделены во время `attach()`" +". Необходимо внимательно следить за освобождением правильных ресурсов даже в " +"случае ошибки, чтобы система оставалась работоспособной при завершении " +"работы вашего драйвера." diff --git a/documentation/content/ru/books/arch-handbook/scsi/_index.adoc b/documentation/content/ru/books/arch-handbook/scsi/_index.adoc --- a/documentation/content/ru/books/arch-handbook/scsi/_index.adoc +++ b/documentation/content/ru/books/arch-handbook/scsi/_index.adoc @@ -4,7 +4,7 @@ params: path: /books/arch-handbook/scsi/ prev: books/arch-handbook/pci -showBookMenu: true +showBookMenu: 'true' tags: ["SCSI", "Controller", "Architecture"] title: 'Глава 12. Контроллеры SCSI с общим методом доступа (CAM)' weight: 14 @@ -284,7 +284,7 @@ Наиболее распространенные запросы в режиме инициатора: -=== _XPT_SCSI_IO_ - выполнить транзакцию ввода-вывода +=== _XPT_SCSI_IO_ — выполнить транзакцию ввода-вывода Экземпляр "struct ccb_scsiio csio" объединения ccb используется для передачи аргументов. Они включают: @@ -493,13 +493,13 @@ } .... -=== _XPT_RESET_DEV_ - отправить устройству сообщение SCSI "BUS DEVICE RESET" +=== _XPT_RESET_DEV_ — отправить устройству сообщение SCSI "BUS DEVICE RESET" В CCB не передаются данные, кроме заголовка, и наиболее интересным аргументом в нём является target_id. В зависимости от аппаратного обеспечения контроллера может быть создан аппаратный блок управления (как для запроса XPT_SCSI_IO, см. описание запроса XPT_SCSI_IO) и отправлен контроллеру, или SCSI-контроллер может быть немедленно запрограммирован на отправку этого сообщения RESET устройству, или этот запрос может просто не поддерживаться (и возвращать статус `CAM_REQ_INVALID`). Также при завершении запроса все отключенные транзакции для этого целевого устройства должны быть прерваны (вероятно, в процедуре прерывания). Кроме того, все текущие переговоры для цели теряются при сбросе, поэтому они также могут быть очищены. Или их очистка может быть отложена, так как в любом случае цель запросит повторные переговоры при следующей транзакции. -=== _XPT_RESET_BUS_ - отправить сигнал RESET на шину SCSI +=== _XPT_RESET_BUS_ — отправить сигнал RESET на шину SCSI В CCB не передаются аргументы, единственный интересный аргумент — это шина SCSI, указанная структурой sim. @@ -560,7 +560,7 @@ Реализация сброса шины SCSI в виде функции может быть хорошей идеей, так как она может быть повторно использована функцией таймаута в качестве последнего средства, если что-то пойдёт не так. -=== _XPT_ABORT_ - прервать указанный CCB +=== _XPT_ABORT_ — прервать указанный CCB Аргументы передаются в экземпляре "struct ccb_abort cab" объединения ccb. Единственное поле аргумента в нём: @@ -697,7 +697,7 @@ return; .... -=== _XPT_SET_TRAN_SETTINGS_ - явно установить значения настроек передачи SCSI +=== _XPT_SET_TRAN_SETTINGS_ — явно установить значения настроек передачи SCSI Аргументы передаются в экземпляре "struct ccb_trans_setting cts" объединения ccb: @@ -800,11 +800,11 @@ После пересогласования значений полученные значения должны быть присвоены как текущим, так и целевым параметрам, чтобы для будущих операций ввода-вывода текущие и целевые параметры совпадали, и функция `target_negotiated()` возвращала TRUE. При инициализации карты (в `xxx_attach()`) текущие параметры согласования должны быть инициализированы узким асинхронным режимом, а целевые и текущие значения должны быть инициализированы максимальными значениями, поддерживаемыми контроллером. -=== _XPT_GET_TRAN_SETTINGS_ - получить значения настроек передачи SCSI +=== _XPT_GET_TRAN_SETTINGS_ — получить значения настроек передачи SCSI Эта операция является обратной XPT_SET_TRAN_SETTINGS. Заполните экземпляр CCB "struct ccb_trans_setting cts" данными, запрошенными флагами CCB_TRANS_CURRENT_SETTINGS или CCB_TRANS_USER_SETTINGS (если установлены оба, существующие драйверы возвращают текущие настройки). Установите все биты в поле valid. -=== _XPT_CALC_GEOMETRY_ - вычислить логическую (BIOS) геометрию диска +=== _XPT_CALC_GEOMETRY_ — вычислить логическую (BIOS) геометрию диска Аргументы передаются в экземпляре "struct ccb_calc_geometry ccg" объединения ccb: @@ -852,7 +852,7 @@ Некоторые системные BIOS и SCSI BIOS конфликтуют друг с другом с переменным успехом. Например, комбинация Symbios 875/895 SCSI и Phoenix BIOS может выдавать геометрию 128/63 после включения питания и 255/63 после жесткого сброса или мягкой перезагрузки. -=== _XPT_PATH_INQ_ - запрос пути, другими словами, получение свойств драйвера SIM и контроллера SCSI (также известного как HBA - Host Bus Adapter) +=== _XPT_PATH_INQ_ — запрос пути, другими словами, получение свойств драйвера SIM и контроллера SCSI (также известного как HBA - Host Bus Adapter) Свойства возвращаются в экземпляре "struct ccb_pathinq cpi" объединения ccb: @@ -1317,7 +1317,7 @@ На этом общее описание обработки прерываний завершается, хотя для некоторых контроллеров могут потребоваться дополнительные действия. [[scsi-errors]] -== Ошибки (Сводка) +== Сводка ошибок При выполнении запроса ввода-вывода может произойти множество ошибок. Причина ошибки может быть указана в статусе CCB с большим количеством деталей. Примеры использования разбросаны по всему документу. Для полноты изложения приведём сводку рекомендуемых действий при типичных ошибках: diff --git a/documentation/content/ru/books/arch-handbook/scsi/_index.po b/documentation/content/ru/books/arch-handbook/scsi/_index.po --- a/documentation/content/ru/books/arch-handbook/scsi/_index.po +++ b/documentation/content/ru/books/arch-handbook/scsi/_index.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\n" -"PO-Revision-Date: 2025-07-05 04:45+0000\n" +"POT-Creation-Date: 2025-05-01 19:56-0300\n" +"PO-Revision-Date: 2025-10-26 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian \n" @@ -25,7 +25,7 @@ msgid "Common Access Method SCSI Controllers" msgstr "Контроллеры SCSI с общим методом доступа (CAM)" -#. type: Yaml Front Matter Hash Value: title +#. type: YAML Front Matter: title #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1 #, no-wrap msgid "Chapter 12. Common Access Method SCSI Controllers" @@ -123,8 +123,8 @@ "способ адресации шин ввода-вывода в стиле SCSI. Это позволяет отделить общие " "драйверы устройств от драйверов, управляющих шиной ввода-вывода: например, " "драйвер диска получает возможность управлять дисками как на SCSI, IDE, так и " -"на любой другой шине, так что часть драйвера диска не нужно переписывать " -"(или копировать и изменять) для каждой новой шины ввода-вывода. Таким " +"на любой другой шине, так что часть драйвера диска не нужно переписывать (" +"или копировать и изменять) для каждой новой шины ввода-вывода. Таким " "образом, двумя наиболее важными активными сущностями являются:" #. type: Plain text @@ -221,9 +221,9 @@ msgstr "" "Первое, что должен сделать каждый драйвер SIM, — это зарегистрироваться в " "подсистеме CAM. Это выполняется в функции `xxx_attach()` драйвера (здесь и " -"далее xxx_ используется для обозначения уникального префикса имени " -"драйвера). Сама функция `xxx_attach()` вызывается кодом автонастройки " -"системной шины, который мы здесь не описываем." +"далее xxx_ используется для обозначения уникального префикса имени драйвера)" +". Сама функция `xxx_attach()` вызывается кодом автонастройки системной шины, " +"который мы здесь не описываем." #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:109 @@ -268,7 +268,8 @@ #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:126 #, no-wrap msgid "SIZE = NUMBER_OF_SUPPORTED_TARGETS * MAX_SIMULTANEOUS_COMMANDS_PER_TARGET\n" -msgstr "SIZE = NUMBER_OF_SUPPORTED_TARGETS * MAX_SIMULTANEOUS_COMMANDS_PER_TARGET\n" +msgstr "" +"SIZE = NUMBER_OF_SUPPORTED_TARGETS * MAX_SIMULTANEOUS_COMMANDS_PER_TARGET\n" #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:129 @@ -472,9 +473,9 @@ "of `devq` can be discarded now: sim will be passed as an argument in all " "further calls from CAM and devq can be derived from it." msgstr "" -"После этого наш контроллер полностью подключён к системе CAM. Значение " -"`devq` теперь можно отбросить: sim будет передаваться в качестве аргумента " -"во всех последующих вызовах из CAM, а devq можно получить из него." +"После этого наш контроллер полностью подключён к системе CAM. Значение `devq`" +" теперь можно отбросить: sim будет передаваться в качестве аргумента во всех " +"последующих вызовах из CAM, а devq можно получить из него." #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:199 @@ -833,8 +834,8 @@ "запрос находится в процессе выполнения. В [.filename]#/sys/cam/cam.h# " "определено удивительно большое количество значений статуса, которые должны " "детально отражать состояние запроса. Что еще интереснее, статус фактически " -"представляет собой \"побитовое ИЛИ\" перечисленного значения статуса " -"(младшие 6 бит) и возможных дополнительных флагов (старшие биты). " +"представляет собой \"побитовое ИЛИ\" перечисленного значения статуса (" +"младшие 6 бит) и возможных дополнительных флагов (старшие биты). " "Перечисленные значения будут подробно рассмотрены далее. Их краткое описание " "можно найти в разделе \"Сводка ошибок\". Возможные флаги статуса:" @@ -972,10 +973,10 @@ "зарезервированные для приватного использования драйвером SIM (например, для " "связи с очередями SIM или приватными блоками управления SIM); фактически они " "существуют как объединения: spriv_ptr0 и spriv_ptr1 имеют тип (void *), " -"spriv_field0 и spriv_field1 имеют тип unsigned long, " -"sim_priv.entries[0].bytes и sim_priv.entries[1].bytes - это байтовые массивы " -"размера, согласованного с другими вариантами объединения, а sim_priv.bytes - " -"это один массив, вдвое большего размера." +"spriv_field0 и spriv_field1 имеют тип unsigned long, sim_priv.entries[0]." +"bytes и sim_priv.entries[1].bytes - это байтовые массивы размера, " +"согласованного с другими вариантами объединения, а sim_priv.bytes - это один " +"массив, вдвое большего размера." #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:339 @@ -1006,7 +1007,7 @@ #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:348 #, no-wrap msgid "_XPT_SCSI_IO_ - execute an I/O transaction" -msgstr "_XPT_SCSI_IO_ - выполнить транзакцию ввода-вывода" +msgstr "_XPT_SCSI_IO_ — выполнить транзакцию ввода-вывода" #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:352 @@ -1105,9 +1106,9 @@ "the tag type, the SIM driver must assign the tag value itself" msgstr "" "MSG_SIMPLE_Q_TAG, MSG_HEAD_OF_Q_TAG, MSG_ORDERED_Q_TAG — значение, " -"соответствующее указанному теговому сообщению (см. /sys/cam/scsi/" -"scsi_message.h); указывает только тип тега, значение тега должно быть " -"назначено самим драйвером SIM" +"соответствующее указанному теговому сообщению (см. /sys/cam/scsi/scsi_message" +".h); указывает только тип тега, значение тега должно быть назначено самим " +"драйвером SIM" #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:369 @@ -1424,10 +1425,12 @@ " if ((!(ccb_h->flags & CAM_SCATTER_VALID)) {\n" " /* single buffer */\n" " if (!(ccb_h->flags & CAM_DATA_PHYS)) {\n" -" rv = add_virtual_chunk(hcb, csio->data_ptr, csio->dxfer_len, dir);\n" +" rv = add_virtual_chunk(hcb, csio->data_ptr, csio->dxfer_len, " +"dir);\n" " }\n" " } else {\n" -" rv = add_physical_chunk(hcb, csio->data_ptr, csio->dxfer_len, dir);\n" +" rv = add_physical_chunk(hcb, csio->data_ptr, csio->dxfer_len, " +"dir);\n" " }\n" " } else {\n" " int i;\n" @@ -1472,7 +1475,8 @@ msgstr "" " if ((ccb_h->flags & CAM_SG_LIST_PHYS) != 0) {\n" " /* The SG list pointer is physical */\n" -" rv = setup_hcb_for_physical_sg_list(hcb, segs, csio->sglist_cnt);\n" +" rv = setup_hcb_for_physical_sg_list(hcb, segs, csio->sglist_cnt);" +"\n" " } else if (!(ccb_h->flags & CAM_DATA_PHYS)) {\n" " /* SG buffer pointers are virtual */\n" " for (i = 0; i < csio->sglist_cnt; i++) {\n" @@ -1572,7 +1576,8 @@ " struct xxx_softc *softc = hcb->softc;\n" msgstr "" " static void\n" -" free_hcb_and_ccb_done(struct xxx_hcb *hcb, union ccb *ccb, u_int32_t status)\n" +" free_hcb_and_ccb_done(struct xxx_hcb *hcb, union ccb *ccb, u_int32_t " +"status)\n" " {\n" " struct xxx_softc *softc = hcb->softc;\n" @@ -1614,7 +1619,8 @@ #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:580 #, no-wrap msgid "_XPT_RESET_DEV_ - send the SCSI \"BUS DEVICE RESET\" message to a device" -msgstr "_XPT_RESET_DEV_ - отправить устройству сообщение SCSI \"BUS DEVICE RESET\"" +msgstr "" +"_XPT_RESET_DEV_ — отправить устройству сообщение SCSI \"BUS DEVICE RESET\"" #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:585 @@ -1654,7 +1660,7 @@ #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:589 #, no-wrap msgid "_XPT_RESET_BUS_ - send the RESET signal to the SCSI bus" -msgstr "_XPT_RESET_BUS_ - отправить сигнал RESET на шину SCSI" +msgstr "_XPT_RESET_BUS_ — отправить сигнал RESET на шину SCSI" #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:592 @@ -1682,10 +1688,10 @@ "processed, both those in the hardware queue and those being disconnected, as " "done with the status CAM_SCSI_BUS_RESET. Like:" msgstr "" -"Правильная реализация дополнительно должна фактически сбросить шину SCSI " -"(возможно, также сбросить контроллер SCSI) и пометить все обрабатываемые " -"CCB, как находящиеся в аппаратной очереди, так и отключенные, как " -"завершенные со статусом CAM_SCSI_BUS_RESET. Например:" +"Правильная реализация дополнительно должна фактически сбросить шину SCSI (" +"возможно, также сбросить контроллер SCSI) и пометить все обрабатываемые CCB, " +"как находящиеся в аппаратной очереди, так и отключенные, как завершенные со " +"статусом CAM_SCSI_BUS_RESET. Например:" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:603 @@ -1793,7 +1799,8 @@ " }\n" msgstr "" " for (lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)\n" -" for (h = softc->first_discon_hcb[targ][lun]; h != NULL; h = hh) {\n" +" for (h = softc->first_discon_hcb[targ][lun]; h != NULL; h = hh) {" +"\n" " hh=h->next;\n" " free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);\n" " }\n" @@ -1836,7 +1843,7 @@ #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:651 #, no-wrap msgid "_XPT_ABORT_ - abort the specified CCB" -msgstr "_XPT_ABORT_ - прервать указанный CCB" +msgstr "_XPT_ABORT_ — прервать указанный CCB" #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:655 @@ -2062,8 +2069,8 @@ "команда не будет прервана в разумное время, например, за 10 секунд, " "процедура таймаута продолжит работу и сбросит всю шину SCSI. Поскольку " "команда будет прервана в разумные сроки, мы можем просто вернуть запрос на " -"прерывание как успешно выполненный и пометить прерванный CCB как прерванный " -"(но пока не помечать его как завершённый)." +"прерывание как успешно выполненный и пометить прерванный CCB как прерванный (" +"но пока не помечать его как завершённый)." #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:753 @@ -2217,7 +2224,8 @@ #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:803 #, no-wrap msgid "_XPT_SET_TRAN_SETTINGS_ - explicitly set values of SCSI transfer settings" -msgstr "_XPT_SET_TRAN_SETTINGS_ - явно установить значения настроек передачи SCSI" +msgstr "" +"_XPT_SET_TRAN_SETTINGS_ — явно установить значения настроек передачи SCSI" #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:806 @@ -2462,7 +2470,8 @@ " softc->goal_sync_offset[targ] =\n" " min(cts->sync_offset, OUR_MAX_SUPPORTED_OFFSET);\n" " if (flags & CCB_TRANS_BUS_WIDTH_VALID)\n" -" softc->goal_bus_width[targ] = min(cts->bus_width, OUR_BUS_WIDTH);\n" +" softc->goal_bus_width[targ] = min(cts->bus_width, OUR_BUS_WIDTH);" +"\n" #. type: delimited block . 4 #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:890 @@ -2533,8 +2542,10 @@ " return 1; /* TRUE */\n" " }\n" msgstr "" -" if (softc->current_sync_period[targ] != softc->goal_sync_period[targ]\n" -" || softc->current_sync_offset[targ] != softc->goal_sync_offset[targ]\n" +" if (softc->current_sync_period[targ] != softc->goal_sync_period[targ]" +"\n" +" || softc->current_sync_offset[targ] != softc->goal_sync_offset[targ]" +"\n" " || softc->current_bus_width[targ] != softc->goal_bus_width[targ])\n" " return 0; /* FALSE */\n" " else\n" @@ -2554,17 +2565,17 @@ msgstr "" "После пересогласования значений полученные значения должны быть присвоены " "как текущим, так и целевым параметрам, чтобы для будущих операций ввода-" -"вывода текущие и целевые параметры совпадали, и функция " -"`target_negotiated()` возвращала TRUE. При инициализации карты (в " -"`xxx_attach()`) текущие параметры согласования должны быть инициализированы " -"узким асинхронным режимом, а целевые и текущие значения должны быть " -"инициализированы максимальными значениями, поддерживаемыми контроллером." +"вывода текущие и целевые параметры совпадали, и функция `target_negotiated()`" +" возвращала TRUE. При инициализации карты (в `xxx_attach()`) текущие " +"параметры согласования должны быть инициализированы узким асинхронным " +"режимом, а целевые и текущие значения должны быть инициализированы " +"максимальными значениями, поддерживаемыми контроллером." #. type: Title === #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:915 #, no-wrap msgid "_XPT_GET_TRAN_SETTINGS_ - get values of SCSI transfer settings" -msgstr "_XPT_GET_TRAN_SETTINGS_ - получить значения настроек передачи SCSI" +msgstr "_XPT_GET_TRAN_SETTINGS_ — получить значения настроек передачи SCSI" #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:920 @@ -2585,7 +2596,7 @@ #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:921 #, no-wrap msgid "_XPT_CALC_GEOMETRY_ - calculate logical (BIOS) geometry of the disk" -msgstr "_XPT_CALC_GEOMETRY_ - вычислить логическую (BIOS) геометрию диска" +msgstr "_XPT_CALC_GEOMETRY_ — вычислить логическую (BIOS) геометрию диска" #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:924 @@ -2599,8 +2610,7 @@ #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:926 msgid "_block_size_ - input, block (A.K.A sector) size in bytes" -msgstr "" -"_block_size_ - вход, размер блока (также известный как сектор) в байтах" +msgstr "_block_size_ - вход, размер блока (также известный как сектор) в байтах" #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:927 @@ -2733,7 +2743,9 @@ #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:972 #, no-wrap msgid "_XPT_PATH_INQ_ - path inquiry, in other words get the SIM driver and SCSI controller (also known as HBA - Host Bus Adapter) properties" -msgstr "_XPT_PATH_INQ_ - запрос пути, другими словами, получение свойств драйвера SIM и контроллера SCSI (также известного как HBA - Host Bus Adapter)" +msgstr "" +"_XPT_PATH_INQ_ — запрос пути, другими словами, получение свойств драйвера " +"SIM и контроллера SCSI (также известного как HBA - Host Bus Adapter)" #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:975 @@ -2798,8 +2810,7 @@ #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:986 msgid "target_sprt - flags for target mode support, 0 if unsupported" -msgstr "" -"target_sprt - флаги поддержки целевого режима, 0 если не поддерживается" +msgstr "target_sprt - флаги поддержки целевого режима, 0 если не поддерживается" #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:987 @@ -2848,8 +2859,8 @@ "max_target - maximal supported target ID (7 for 8-bit bus, 15 for 16-bit " "bus, 127 for Fibre Channel)" msgstr "" -"max_target - максимальный поддерживаемый идентификатор целевого устройства " -"(7 для 8-битной шины, 15 для 16-битной шины, 127 для Fibre Channel)" +"max_target - максимальный поддерживаемый идентификатор целевого устройства (" +"7 для 8-битной шины, 15 для 16-битной шины, 127 для Fibre Channel)" #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:995 @@ -3042,7 +3053,8 @@ "ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)\n" msgstr "" "static void\n" -"ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)\n" +"ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void " +"*arg)\n" #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1062 @@ -3358,12 +3370,15 @@ " }\n" msgstr "" " for (lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)\n" -" for (h = softc->first_discon_hcb[targ][lun]; h != NULL; h = hh) {\n" +" for (h = softc->first_discon_hcb[targ][lun]; h != NULL; h = " +"hh) {\n" " hh=h->next;\n" " if (fatal)\n" -" free_hcb_and_ccb_done(h, h->ccb, CAM_UNREC_HBA_ERROR);\n" +" free_hcb_and_ccb_done(h, h->ccb, " +"CAM_UNREC_HBA_ERROR);\n" " else\n" -" free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);\n" +" free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);" +"\n" " }\n" " }\n" @@ -3518,7 +3533,8 @@ " if (hcb->flags & DOING_AUTOSENSE) {\n" " if (scsi_status == GOOD) { /* autosense was successful */\n" " hcb->ccb->ccb_h.status |= CAM_AUTOSNS_VALID;\n" -" free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_SCSI_STATUS_ERROR);\n" +" free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_SCSI_STATUS_ERROR);" +"\n" " } else {\n" " autosense_failed:\n" " free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_AUTOSENSE_FAIL);\n" @@ -3852,7 +3868,8 @@ " }\n" " break;\n" msgstr "" -" /* this was the CAM_RESET_DEV request itself, it is completed */\n" +" /* this was the CAM_RESET_DEV request itself, it is completed */" +"\n" " ccb_status = CAM_REQ_CMP;\n" " } else {\n" " calculate_residue(hcb);\n" @@ -4012,7 +4029,8 @@ " return;\n" msgstr "" " if (targ == h->targ\n" -" && (lun_to_freeze == CAM_LUN_WILDCARD || lun_to_freeze == h->lun))\n" +" && (lun_to_freeze == CAM_LUN_WILDCARD || lun_to_freeze == " +"h->lun))\n" " free_hcb_and_ccb_done(h, h->ccb, CAM_REQUEUE_REQ);\n" " }\n" " }\n" @@ -4033,7 +4051,7 @@ #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1458 #, no-wrap msgid "Errors Summary" -msgstr "Ошибки (Сводка)" +msgstr "Сводка ошибок" #. type: Plain text #: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1464 @@ -4073,8 +4091,8 @@ "direction than specified in CAM_DIR_MASK) or odd transfer length for wide " "transfer" msgstr "" -"_CAM_DATA_RUN_ERR_ - переполнение данных или неожиданная фаза данных " -"(направление передачи не соответствует указанному в CAM_DIR_MASK) или " +"_CAM_DATA_RUN_ERR_ - переполнение данных или неожиданная фаза данных (" +"направление передачи не соответствует указанному в CAM_DIR_MASK) или " "нечётная длина передачи для широкой передачи" #. type: Plain text @@ -4254,7 +4272,8 @@ " }\n" "}\n" msgstr "" -" if (hcb->flags & HCB_BEING_ABORTED || ccb_h->func_code == XPT_RESET_DEV) {\n" +" if (hcb->flags & HCB_BEING_ABORTED || ccb_h->func_code == XPT_RESET_DEV) " +"{\n" " xxx_reset_bus(softc);\n" " } else {\n" " xxx_abort_ccb(hcb->ccb, CAM_CMD_TIMEOUT);\n" diff --git a/documentation/content/ru/books/arch-handbook/smp/_index.adoc b/documentation/content/ru/books/arch-handbook/smp/_index.adoc --- a/documentation/content/ru/books/arch-handbook/smp/_index.adoc +++ b/documentation/content/ru/books/arch-handbook/smp/_index.adoc @@ -4,7 +4,7 @@ params: path: /books/arch-handbook/smp/ prev: books/arch-handbook/vm -showBookMenu: true +showBookMenu: 'true' tags: ["SMPng", "introduction", "locks"] title: 'Глава 8. Документ по архитектуре SMPng' weight: 9 @@ -87,7 +87,7 @@ === Обработка прерываний -Следуя примеру нескольких других многопоточных ядер UNIX(R), FreeBSD реализрвала обработчики прерываний, предоставив им собственный контекст потока. Предоставление контекста для обработчиков прерываний позволяет им блокироваться на блокировках. Однако, чтобы избежать задержек, потоки обработки прерываний выполняются с приоритетом реального времени в ядре. Таким образом, обработчики прерываний не должны выполняться слишком долго, чтобы не лишать ресурсов другие потоки ядра. Кроме того, поскольку несколько обработчиков могут использовать один поток прерываний, обработчики прерываний не должны переходить в режим сна или использовать блокировки, допускающие сон, чтобы не лишать ресурсов другие обработчики прерываний. +Следуя примеру нескольких других многопоточных ядер UNIX(R), FreeBSD реализовала обработчики прерываний, предоставив им собственный контекст потока. Предоставление контекста для обработчиков прерываний позволяет им блокироваться на блокировках. Однако, чтобы избежать задержек, потоки обработки прерываний выполняются с приоритетом реального времени в ядре. Таким образом, обработчики прерываний не должны выполняться слишком долго, чтобы не лишать ресурсов другие потоки ядра. Кроме того, поскольку несколько обработчиков могут использовать один поток прерываний, обработчики прерываний не должны переходить в режим сна или использовать блокировки, допускающие сон, чтобы не лишать ресурсов другие обработчики прерываний. Текущие потоки обработки прерываний в FreeBSD называются тяжеловесными потоками обработки прерываний. Они получили такое название, потому что переключение на поток обработки прерывания включает в себя полное переключение контекста. В первоначальной реализации ядро не было вытесняющим, поэтому прерывания, которые прерывали поток ядра, должны были ждать, пока поток ядра не заблокируется или не вернётся в пользовательское пространство, прежде чем у них появится возможность выполниться. @@ -138,7 +138,7 @@ Критические секции в настоящее время предотвращают миграцию, поскольку они не допускают переключения контекстов. Однако это может быть слишком строгим требованием в некоторых случаях, так как критическая секция также эффективно блокирует потоки прерываний на текущем процессоре. В результате был предоставлен другой API, позволяющий текущему потоку указать, что если он будет вытеснен, он не должен мигрировать на другой CPU. -Этот API известен как закрепление потока и предоставляется планировщиком. API состоит из двух функций: `sched_pin` и `sched_unpin`. Эти функции управляют счетчиком вложенности `td_pinned` для каждого потока. Поток считается закрепленным, когда его счетчик вложенности больше нуля, и прекрашает быть закрепленным с нулевым счетчиком вложенности. Каждая реализация планировщика должна гарантировать, что закрепленные потоки выполняются только на том CPU, на котором они выполнялись при первом вызове `sched_pin`. Поскольку счетчик вложенности изменяется только самим потоком и читается другими потоками только тогда, когда закрепленный поток не выполняется, но удерживается `sched_lock`, то `td_pinned` не требует блокировки. Функция `sched_pin` увеличивает счетчик вложенности, а `sched_unpin` уменьшает его. Обратите внимание, что эти функции работают только с текущим потоком и привязывают текущий поток к CPU, на котором он выполняется в данный момент. Для привязки произвольного потока к определенному CPU следует использовать функции `sched_bind` и `sched_unbind`. +Этот API известен как закрепление потока и предоставляется планировщиком. API состоит из двух функций: `sched_pin` и `sched_unpin`. Эти функции управляют счетчиком вложенности `td_pinned` для каждого потока. Поток считается закрепленным, когда его счетчик вложенности больше нуля, и прекращает быть закрепленным с нулевым счетчиком вложенности. Каждая реализация планировщика должна гарантировать, что закрепленные потоки выполняются только на том CPU, на котором они выполнялись при первом вызове `sched_pin`. Поскольку счетчик вложенности изменяется только самим потоком и читается другими потоками только тогда, когда закрепленный поток не выполняется, но удерживается `sched_lock`, то `td_pinned` не требует блокировки. Функция `sched_pin` увеличивает счетчик вложенности, а `sched_unpin` уменьшает его. Обратите внимание, что эти функции работают только с текущим потоком и привязывают текущий поток к CPU, на котором он выполняется в данный момент. Для привязки произвольного потока к определенному CPU следует использовать функции `sched_bind` и `sched_unbind`. === Обратные вызовы @@ -238,7 +238,7 @@ Хеш-таблица очередей сна содержит очереди сна для каналов ожидания, у которых есть хотя бы один заблокированный поток. Каждая запись в хеш-таблице называется цепочкой очереди сна. Цепочка содержит связанный список очередей сна и спин-мьютекс. Спин-мьютекс защищает список очередей сна, а также содержимое структур очередей сна в списке. С каждым каналом ожидания связана только одна очередь сна. Если несколько потоков блокируются на одном канале ожидания, то очереди сна, связанные со всеми потоками, кроме первого, хранятся в списке свободных очередей сна в главной очереди сна. Когда поток удаляется из очереди сна, он получает одну из структур очереди сна из свободного списка главной очереди, если он не является единственным потоком в очереди. Последний поток получает главную очередь сна при возобновлении. Поскольку потоки могут удаляться из очереди сна в порядке, отличном от порядка добавления, поток может покинуть очередь сна с другой структурой очереди сна, чем та, с которой он в неё попал. -Функция `sleepq_lock` блокирует спин-мьютес цепи очереди сна, соответствующей определённому каналу ожидания. Функция `sleepq_lookup` выполняет поиск в хеш-таблице главной очереди сна, связанной с заданным каналом ожидания. Если главная очередь сна не найдена, функция возвращает `NULL`. Функция `sleepq_release` разблокирует спин-мьютес, связанный с заданным каналом ожидания. +Функция `sleepq_lock` блокирует спин-мьютекс цепи очереди сна, соответствующей определённому каналу ожидания. Функция `sleepq_lookup` выполняет поиск в хеш-таблице главной очереди сна, связанной с заданным каналом ожидания. Если главная очередь сна не найдена, функция возвращает `NULL`. Функция `sleepq_release` разблокирует спин-мьютекс, связанный с заданным каналом ожидания. Поток добавляется в очередь ожидания с помощью `sleepq_add`. Эта функция принимает канал ожидания, указатель на мьютекс, защищающий канал ожидания, строку описания сообщения ожидания и маску флагов. Цепь очереди ожидания должна быть заблокирована с помощью `sleepq_lock` перед вызовом этой функции. Если канал ожидания не защищен мьютексом (или защищен мьютексом Giant), то аргумент указателя на мьютекс должен быть `NULL`. Аргумент флагов содержит поле типа, указывающее на вид очереди ожидания, в которую добавляется поток, и флаг, указывающий, является ли ожидание прерываемым (`SLEEPQ_INTERRUPTIBLE`). В настоящее время существует только два типа очередей ожидания: традиционные очереди, управляемые через функции `msleep` и `wakeup` (`SLEEPQ_MSLEEP`), и очереди ожидания условных переменных (`SLEEPQ_CONDVAR`). Тип очереди ожидания и аргумент указателя на блокировку используются исключительно для внутренних проверок утверждений. Код, вызывающий `sleepq_add`, должен явно разблокировать любой блокировочный механизм, защищающий канал ожидания, после того как связанная цепь очереди ожидания будет заблокирована через `sleepq_lock` и перед блокировкой в очереди ожидания с помощью одной из функций ожидания. @@ -326,7 +326,7 @@ Операция с памятью выполняет чтение и/или запись в ячейку памяти. MI:: -Машинно-независимый (machine independent). +Машинонезависимый (machine independent). + См. также MD. diff --git a/documentation/content/ru/books/arch-handbook/smp/_index.po b/documentation/content/ru/books/arch-handbook/smp/_index.po --- a/documentation/content/ru/books/arch-handbook/smp/_index.po +++ b/documentation/content/ru/books/arch-handbook/smp/_index.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\n" -"PO-Revision-Date: 2025-08-26 04:45+0000\n" +"POT-Creation-Date: 2025-05-01 19:56-0300\n" +"PO-Revision-Date: 2025-10-29 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian \n" @@ -25,7 +25,7 @@ msgid "SMPng Design Document" msgstr "Документ по архитектуре SMPng" -#. type: Yaml Front Matter Hash Value: title +#. type: YAML Front Matter: title #: documentation/content/en/books/arch-handbook/smp/_index.adoc:1 #, no-wrap msgid "Chapter 8. SMPng Design Document" @@ -308,7 +308,7 @@ "sleepable lock to avoid starving another interrupt handler." msgstr "" "Следуя примеру нескольких других многопоточных ядер UNIX(R), FreeBSD " -"реализрвала обработчики прерываний, предоставив им собственный контекст " +"реализовала обработчики прерываний, предоставив им собственный контекст " "потока. Предоставление контекста для обработчиков прерываний позволяет им " "блокироваться на блокировках. Однако, чтобы избежать задержек, потоки " "обработки прерываний выполняются с приоритетом реального времени в ядре. " @@ -545,10 +545,10 @@ "Ответственность API критической секции заключается в предотвращении " "переключения контекста внутри критической секции. В полностью вытесняющем " "ядре каждый вызов `setrunqueue` для потока, отличного от текущего, является " -"точкой вытеснения. Одна из реализаций заключается в том, что " -"`critical_enter` устанавливает флаг для каждого потока, который сбрасывается " -"его парной функцией. Если `setrunqueue` вызывается, когда этот флаг " -"установлен, вытеснение не происходит, независимо от приоритета нового потока " +"точкой вытеснения. Одна из реализаций заключается в том, что `critical_enter`" +" устанавливает флаг для каждого потока, который сбрасывается его парной " +"функцией. Если `setrunqueue` вызывается, когда этот флаг установлен, " +"вытеснение не происходит, независимо от приоритета нового потока " "относительно текущего. Однако, поскольку критические секции используются в " "спин-блокировках для предотвращения переключения контекста и может быть " "захвачено несколько спин-блокировок, API критической секции должен " @@ -776,7 +776,7 @@ "API состоит из двух функций: `sched_pin` и `sched_unpin`. Эти функции " "управляют счетчиком вложенности `td_pinned` для каждого потока. Поток " "считается закрепленным, когда его счетчик вложенности больше нуля, и " -"прекрашает быть закрепленным с нулевым счетчиком вложенности. Каждая " +"прекращает быть закрепленным с нулевым счетчиком вложенности. Каждая " "реализация планировщика должна гарантировать, что закрепленные потоки " "выполняются только на том CPU, на котором они выполнялись при первом вызове " "`sched_pin`. Поскольку счетчик вложенности изменяется только самим потоком и " @@ -866,13 +866,13 @@ msgstr "" "`struct ucred` — это внутренняя структура учетных данных ядра, которая " "обычно используется в качестве основы для управления доступом на уровне " -"процессов внутри ядра. Системы, производные от BSD, используют модель " -"«копирования при записи» для учетных данных: могут существовать " -"множественные ссылки на структуру учетных данных, и когда требуется внести " -"изменение, структура дублируется, изменяется, а затем ссылка заменяется. " -"Благодаря широко распространенному кэшированию учетных данных для реализации " -"контроля доступа при открытии, это приводит к значительной экономии памяти. " -"С переходом на детализированную SMP (симметричную многопроцессорность), эта " +"процессов внутри ядра. Системы, производные от BSD, используют модель «" +"копирования при записи» для учетных данных: могут существовать множественные " +"ссылки на структуру учетных данных, и когда требуется внести изменение, " +"структура дублируется, изменяется, а затем ссылка заменяется. Благодаря " +"широко распространенному кэшированию учетных данных для реализации контроля " +"доступа при открытии, это приводит к значительной экономии памяти. С " +"переходом на детализированную SMP (симметричную многопроцессорность), эта " "модель также существенно экономит на операциях блокировки, требуя, чтобы " "модификации выполнялись только для неразделяемых учетных данных, избегая " "необходимости явной синхронизации при использовании известных разделяемых " @@ -890,11 +890,10 @@ msgstr "" "Структуры учетных данных с единственной ссылкой считаются изменяемыми; " "разделяемые структуры учетных данных не должны изменяться, иначе возникает " -"риск состояния гонки. Мьютекс `cr_mtxp` защищает счетчик ссылок структуры " -"`struct ucred` для поддержания согласованности. Любое использование " -"структуры требует действительной ссылки на протяжении всего времени " -"использования, иначе структура может быть освобождена из-под нелегитимного " -"потребителя." +"риск состояния гонки. Мьютекс `cr_mtxp` защищает счетчик ссылок структуры `" +"struct ucred` для поддержания согласованности. Любое использование структуры " +"требует действительной ссылки на протяжении всего времени использования, " +"иначе структура может быть освобождена из-под нелегитимного потребителя." #. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:163 @@ -982,8 +981,8 @@ "счётчика ссылок и всех изменяемых переменных внутри `struct jail`. Некоторые " "переменные устанавливаются только при создании клетки, и действительной " "ссылки на `struct prison` достаточно для чтения этих значений. Точная " -"блокировка каждой записи документирована в комментариях файла " -"[.filename]#sys/jail.h#." +"блокировка каждой записи документирована в комментариях файла [.filename]#" +"sys/jail.h#." #. type: Title === #: documentation/content/en/books/arch-handbook/smp/_index.adoc:176 @@ -1222,8 +1221,8 @@ "зарегистрироваться для получения SIGIO от любого заданного объекта ядра, и " "такой процесс или группа называется владельцем. Каждый объект, " "поддерживающий регистрацию SIGIO, содержит поле-указатель, которое имеет " -"значение `NULL`, если объект не зарегистрирован, или указывает на структуру " -"`struct sigio`, описывающую регистрацию. Это поле защищено глобальным " +"значение `NULL`, если объект не зарегистрирован, или указывает на структуру `" +"struct sigio`, описывающую регистрацию. Это поле защищено глобальным " "мьютексом `sigio_lock`. Вызывающие функции обслуживания SIGIO должны " "передавать это поле «по ссылке», чтобы локальные копии регистра не " "создавались без защиты блокировкой." @@ -1432,11 +1431,11 @@ "`sleepq_release` function unlocks the spin mutex associated with a given " "wait channel." msgstr "" -"Функция `sleepq_lock` блокирует спин-мьютес цепи очереди сна, " +"Функция `sleepq_lock` блокирует спин-мьютекс цепи очереди сна, " "соответствующей определённому каналу ожидания. Функция `sleepq_lookup` " "выполняет поиск в хеш-таблице главной очереди сна, связанной с заданным " "каналом ожидания. Если главная очередь сна не найдена, функция возвращает " -"`NULL`. Функция `sleepq_release` разблокирует спин-мьютес, связанный с " +"`NULL`. Функция `sleepq_release` разблокирует спин-мьютекс, связанный с " "заданным каналом ожидания." #. type: Plain text @@ -1525,13 +1524,13 @@ "пробуждения. Функция `sleepq_timedwait` ожидает, пока поток не будет явно " "возобновлён или пока не истечёт таймаут, установленный предыдущим вызовом " "`sleepq_set_timeout`. Функция `sleepq_wait_sig` ожидает, пока поток не будет " -"явно возобновлён или его сон не будет прерван. Функция " -"`sleepq_timedwait_sig` ожидает, пока поток не будет явно возобновлён, не " -"истечёт таймаут, установленный предыдущим вызовом `sleepq_set_timeout`, или " -"сон потока не будет прерван. Все функции ожидания принимают канал ожидания в " -"качестве первого параметра. Кроме того, функция `sleepq_timedwait_sig` " -"принимает второй логический параметр, указывающий, обнаружил ли предыдущий " -"вызов `sleepq_catch_signals` ожидающий сигнал." +"явно возобновлён или его сон не будет прерван. Функция `sleepq_timedwait_sig`" +" ожидает, пока поток не будет явно возобновлён, не истечёт таймаут, " +"установленный предыдущим вызовом `sleepq_set_timeout`, или сон потока не " +"будет прерван. Все функции ожидания принимают канал ожидания в качестве " +"первого параметра. Кроме того, функция `sleepq_timedwait_sig` принимает " +"второй логический параметр, указывающий, обнаружил ли предыдущий вызов " +"`sleepq_catch_signals` ожидающий сигнал." #. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:254 @@ -1763,7 +1762,7 @@ msgid "atomic" msgstr "atomic (атомарный)" -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:313 msgid "" "An operation is atomic if all of its effects are visible to other CPUs " @@ -1781,7 +1780,7 @@ "выполняются при удержании блокировки без её освобождения между любыми из " "операций." -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:315 msgid "See Also operation." msgstr "См. также operation (операция)." @@ -1792,7 +1791,7 @@ msgid "block" msgstr "block (блокировать)" -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:318 msgid "" "A thread is blocked when it is waiting on a lock, resource, or condition. " @@ -1801,7 +1800,7 @@ "Поток блокируется, когда он ожидает блокировку, ресурс или условие. К " "сожалению, этот термин в результате немного перегружен." -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:320 #: documentation/content/en/books/arch-handbook/smp/_index.adoc:357 msgid "See Also sleep." @@ -1813,7 +1812,7 @@ msgid "critical section" msgstr "critical section (критическая секция)" -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:323 msgid "" "A section of code that is not allowed to be preempted. A critical section is " @@ -1828,12 +1827,12 @@ msgid "MD" msgstr "MD" -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:326 msgid "Machine dependent." msgstr "Машинозависимый (machine dependent)." -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:328 msgid "See Also MI." msgstr "Смотри также MI." @@ -1844,7 +1843,7 @@ msgid "memory operation" msgstr "memory operation (операция с памятью)" -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:331 msgid "A memory operation reads and/or writes to a memory location." msgstr "Операция с памятью выполняет чтение и/или запись в ячейку памяти." @@ -1855,12 +1854,12 @@ msgid "MI" msgstr "MI" -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:334 msgid "Machine independent." -msgstr "Машинно-независимый (machine independent)." +msgstr "Машинонезависимый (machine independent)." -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:336 msgid "See Also MD." msgstr "См. также MD." @@ -1871,7 +1870,7 @@ msgid "operation" msgstr "operation (операция)" -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:339 msgid "See memory operation." msgstr "См. memory operation (операция с памятью)." @@ -1882,7 +1881,7 @@ msgid "primary interrupt context" msgstr "primary interrupt context (основной контекст прерывания)" -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:342 msgid "" "Primary interrupt context refers to the code that runs when an interrupt " @@ -1901,7 +1900,7 @@ msgid "realtime kernel thread" msgstr "realtime kernel thread (поток ядра реального времени)" -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:345 msgid "" "A high priority kernel thread. Currently, the only realtime priority kernel " @@ -1910,7 +1909,7 @@ "Высокоприоритетный поток ядра. В настоящее время единственными потоками ядра " "с реальным приоритетом являются потоки обработки прерываний." -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:347 msgid "See Also thread." msgstr "См. также thread (поток)." @@ -1921,7 +1920,7 @@ msgid "sleep" msgstr "sleep (спать)" -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:350 msgid "" "A thread is asleep when it is blocked on a condition variable or a sleep " @@ -1930,7 +1929,7 @@ "Поток находится в состоянии сна, когда он заблокирован на условной " "переменной или в очереди сна через `msleep` или `tsleep`." -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:352 msgid "See Also block." msgstr "См. также block (блокировать)." @@ -1941,7 +1940,7 @@ msgid "sleepable lock" msgstr "sleepable lock (блокировка с возможностью сна)" -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:355 msgid "" "A sleepable lock is a lock that can be held by a thread which is asleep. " @@ -1961,7 +1960,7 @@ msgid "thread" msgstr "thread (поток)" -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:360 msgid "" "A kernel thread represented by a struct thread. Threads own locks and hold a " @@ -1976,7 +1975,7 @@ msgid "wait channel" msgstr "wait channel (канал ожидания)" -#. type: .glosslist +#. type: Plain text #: documentation/content/en/books/arch-handbook/smp/_index.adoc:363 msgid "A kernel virtual address that threads may sleep on." msgstr "" diff --git a/documentation/content/ru/books/arch-handbook/sound/_index.adoc b/documentation/content/ru/books/arch-handbook/sound/_index.adoc --- a/documentation/content/ru/books/arch-handbook/sound/_index.adoc +++ b/documentation/content/ru/books/arch-handbook/sound/_index.adoc @@ -4,7 +4,7 @@ params: path: /books/arch-handbook/sound/ prev: books/arch-handbook/newbus -showBookMenu: true +showBookMenu: 'true' tags: ["Sound", "OSS", "pcm", "mixer"] title: 'Глава 15. Звуковая подсистема' weight: 17 diff --git a/documentation/content/ru/books/arch-handbook/sound/_index.po b/documentation/content/ru/books/arch-handbook/sound/_index.po --- a/documentation/content/ru/books/arch-handbook/sound/_index.po +++ b/documentation/content/ru/books/arch-handbook/sound/_index.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\n" +"POT-Creation-Date: 2025-05-01 19:56-0300\n" "PO-Revision-Date: 2025-08-26 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian =20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" -#. type: Yaml Front Matter Hash Value: description +#. type: YAML Front Matter: description #: documentation/content/en/books/arch-handbook/sound/_index.adoc:1 #, no-wrap msgid "FreeBSD Sound Subsystem" msgstr "Звуковая подсистема FreeBSD" -#. type: Yaml Front Matter Hash Value: title +#. type: YAML Front Matter: title #: documentation/content/en/books/arch-handbook/sound/_index.adoc:1 #, no-wrap msgid "Chapter 15. Sound Subsystem" @@ -175,8 +175,8 @@ msgstr "" "В каталоге [.filename]#/usr/src/sys/dev/sound/#, папка [.filename]#pcm/# " "содержит основной код, тогда как каталоги [.filename]#pci/#, [.filename]#isa/" -"# и [.filename]#usb/# содержат драйверы для плат PCI и ISA, а также для USB-" -"аудиоустройств." +"# и [.filename]#usb/# содержат драйверы для плат PCI и ISA, а также для " +"USB-аудиоустройств." #. type: Title == #: documentation/content/en/books/arch-handbook/sound/_index.adoc:79 @@ -235,7 +235,8 @@ " MODULE_DEPEND(snd_xxxpci, snd_pcm, PCM_MINVER, PCM_PREFVER,PCM_MAXVER);\n" msgstr "" " DRIVER_MODULE(snd_xxxpci, pci, xxx_driver, pcm_devclass, 0, 0);\n" -" MODULE_DEPEND(snd_xxxpci, snd_pcm, PCM_MINVER, PCM_PREFVER,PCM_MAXVER);\n" +" MODULE_DEPEND(snd_xxxpci, snd_pcm, PCM_MINVER, " +"PCM_PREFVER,PCM_MAXVER);\n" #. type: Plain text #: documentation/content/en/books/arch-handbook/sound/_index.adoc:100 @@ -288,8 +289,8 @@ "init,`xxxchannel_init()`]." msgstr "" "Подпрограмма подключения звукового драйвера объявляет каждый из своих " -"каналов вызовами `pcm_addchan()`. Это настраивает связующий слой канала в " -"[.filename]#pcm# и, в свою очередь, вызывает вызов crossref:sound[xxxchannel-" +"каналов вызовами `pcm_addchan()`. Это настраивает связующий слой канала в [." +"filename]#pcm# и, в свою очередь, вызывает вызов crossref:sound[xxxchannel-" "init,`xxxchannel_init()`]." #. type: Plain text @@ -316,10 +317,10 @@ "and, if it finds a supported device, creates a new pcm device which is then " "passed to probe/attach." msgstr "" -"Используйте метод `device_identify()` (пример: [.filename]#sound/isa/" -"es1888.c#). Метод `device_identify()` проверяет наличие оборудования по " -"известным адресам и, если находит поддерживаемое устройство, создает новое " -"pcm-устройство, которое затем передается для probe/attach." +"Используйте метод `device_identify()` (пример: [.filename]#sound/isa/es1888." +"c#). Метод `device_identify()` проверяет наличие оборудования по известным " +"адресам и, если находит поддерживаемое устройство, создает новое pcm-" +"устройство, которое затем передается для probe/attach." #. type: Plain text #: documentation/content/en/books/arch-handbook/sound/_index.adoc:113 @@ -337,9 +338,9 @@ "and `device_shutdown` routines, so that power management and module " "unloading function correctly." msgstr "" -"[.filename]#pcm# драйверы должны реализовывать подпрограммы " -"`device_suspend`, `device_resume` и `device_shutdown`, чтобы управление " -"питанием и выгрузка модулей работали корректно." +"[.filename]#pcm# драйверы должны реализовывать подпрограммы `device_suspend`" +", `device_resume` и `device_shutdown`, чтобы управление питанием и выгрузка " +"модулей работали корректно." #. type: Title == #: documentation/content/en/books/arch-handbook/sound/_index.adoc:117 @@ -604,7 +605,8 @@ " }\n" msgstr "" " static int\n" -" xxxchannel_setformat(kobj_t obj, void *data, u_int32_t format) <.>\n" +" xxxchannel_setformat(kobj_t obj, void *data, u_int32_t format) <.>" +"\n" " {\n" " struct xxx_chinfo *ch = data;\n" " ...\n" @@ -698,7 +700,8 @@ " }\n" msgstr "" " static int\n" -" xxxchannel_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)\n" +" xxxchannel_setblocksize(kobj_t obj, void *data, u_int32_t " +"blocksize)\n" " {\n" " struct xxx_chinfo *ch = data;\n" " ...\n" @@ -764,8 +767,8 @@ "things." msgstr "" "Если драйвер использует ISA DMA, перед выполнением действий с устройством " -"следует вызвать `sndbuf_isadma()`, которая позаботится о том, что делает DMA-" -"чип." +"следует вызвать `sndbuf_isadma()`, которая позаботится о том, что делает " +"DMA-чип." #. type: Title ==== #: documentation/content/en/books/arch-handbook/sound/_index.adoc:248 @@ -1110,8 +1113,7 @@ #. type: Plain text #: documentation/content/en/books/arch-handbook/sound/_index.adoc:357 msgid "`ac97_read()` and `ac97_write()` read or write a specified register." -msgstr "" -"`ac97_read()` и `ac97_write()` читают или записывают указанный регистр." +msgstr "`ac97_read()` и `ac97_write()` читают или записывают указанный регистр." #. type: Plain text #: documentation/content/en/books/arch-handbook/sound/_index.adoc:358 @@ -1121,5 +1123,5 @@ "others under [.filename]#sound/pci/# for an example." msgstr "" "Интерфейс _AC97_ используется кодом AC97 в [.filename]#pcm# для выполнения " -"операций более высокого уровня. В качестве примера можно посмотреть " -"[.filename]#sound/pci/maestro3.c# или другие файлы в [.filename]#sound/pci/#." +"операций более высокого уровня. В качестве примера можно посмотреть [." +"filename]#sound/pci/maestro3.c# или другие файлы в [.filename]#sound/pci/#." diff --git a/documentation/content/ru/books/arch-handbook/sysinit/_index.adoc b/documentation/content/ru/books/arch-handbook/sysinit/_index.adoc --- a/documentation/content/ru/books/arch-handbook/sysinit/_index.adoc +++ b/documentation/content/ru/books/arch-handbook/sysinit/_index.adoc @@ -4,7 +4,7 @@ params: path: /books/arch-handbook/sysinit/ prev: books/arch-handbook/jail -showBookMenu: true +showBookMenu: 'true' tags: ["SYSINIT", "framework", "Terminology"] title: 'Глава 5. Фреймворк SYSINIT' weight: 6 diff --git a/documentation/content/ru/books/arch-handbook/sysinit/_index.po b/documentation/content/ru/books/arch-handbook/sysinit/_index.po --- a/documentation/content/ru/books/arch-handbook/sysinit/_index.po +++ b/documentation/content/ru/books/arch-handbook/sysinit/_index.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\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 \n" "Language-Team: Russian # в перечислении `sysinit_sub_id`. Второй " "используемый приоритет — это порядок элементов внутри подсистемы. " -"Предварительно объявленные порядки элементов подсистемы находятся в " -"[.filename]## в перечислении `sysinit_elem_order`." +"Предварительно объявленные порядки элементов подсистемы находятся в [." +"filename]## в перечислении `sysinit_elem_order`." #. type: Plain text #: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:67 diff --git a/documentation/content/ru/books/arch-handbook/usb/_index.adoc b/documentation/content/ru/books/arch-handbook/usb/_index.adoc --- a/documentation/content/ru/books/arch-handbook/usb/_index.adoc +++ b/documentation/content/ru/books/arch-handbook/usb/_index.adoc @@ -4,7 +4,7 @@ params: path: /books/arch-handbook/usb/ prev: books/arch-handbook/scsi -showBookMenu: true +showBookMenu: 'true' tags: ["USB", "Structure", "UHCI", "OHCI"] title: 'Глава 13. USB-устройства' weight: 15 diff --git a/documentation/content/ru/books/arch-handbook/usb/_index.po b/documentation/content/ru/books/arch-handbook/usb/_index.po --- a/documentation/content/ru/books/arch-handbook/usb/_index.po +++ b/documentation/content/ru/books/arch-handbook/usb/_index.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\n" +"POT-Creation-Date: 2025-05-01 19:56-0300\n" "PO-Revision-Date: 2025-07-12 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian =20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" -#. type: Yaml Front Matter Hash Value: description +#. type: YAML Front Matter: description #: documentation/content/en/books/arch-handbook/usb/_index.adoc:1 #, no-wrap msgid "USB Devices in FreeBSD" msgstr "Устройства USB в FreeBSD" -#. type: Yaml Front Matter Hash Value: title +#. type: YAML Front Matter: title #: documentation/content/en/books/arch-handbook/usb/_index.adoc:1 #, no-wrap msgid "Chapter 13. USB Devices" @@ -170,8 +170,8 @@ "USB 2.0 Specification (http://www.usb.org/developers/docs/usb20_docs/[http://" "www.usb.org/developers/docs/usb20_docs/])" msgstr "" -"Спецификация USB 2.0 (http://www.usb.org/developers/docs/usb20_docs/[http://" -"www.usb.org/developers/docs/usb20_docs/])" +"Спецификация USB 2.0 (http://www.usb.org/developers/docs/usb20_docs/" +"[http://www.usb.org/developers/docs/usb20_docs/])" #. type: Plain text #: documentation/content/en/books/arch-handbook/usb/_index.adoc:69 @@ -180,9 +180,9 @@ "ftp.netbsd.org/pub/NetBSD/misc/blymn/uhci11d.pdf[ftp://ftp.netbsd.org/pub/" "NetBSD/misc/blymn/uhci11d.pdf)]" msgstr "" -"Универсальный интерфейс хост-контроллера (UHCI) Спецификация (link:ftp://" -"ftp.netbsd.org/pub/NetBSD/misc/blymn/uhci11d.pdf[ftp://ftp.netbsd.org/pub/" -"NetBSD/misc/blymn/uhci11d.pdf])" +"Универсальный интерфейс хост-контроллера (UHCI) Спецификация (link:ftp://ftp." +"netbsd.org/pub/NetBSD/misc/blymn/uhci11d.pdf[ftp://ftp.netbsd.org/pub/NetBSD/" +"misc/blymn/uhci11d.pdf])" #. type: Plain text #: documentation/content/en/books/arch-handbook/usb/_index.adoc:70 @@ -191,9 +191,9 @@ "ftp.compaq.com/pub/supportinformation/papers/hcir1_0a.pdf[ftp://" "ftp.compaq.com/pub/supportinformation/papers/hcir1_0a.pdf])" msgstr "" -"Спецификация интерфейса Open Host Controller (OHCI)(link:ftp://" -"ftp.compaq.com/pub/supportinformation/papers/hcir1_0a.pdf[ftp://" -"ftp.compaq.com/pub/supportinformation/papers/hcir1_0a.pdf])" +"Спецификация интерфейса Open Host Controller (OHCI)(link:ftp://ftp.compaq." +"com/pub/supportinformation/papers/hcir1_0a.pdf[ftp://ftp.compaq.com/pub/" +"supportinformation/papers/hcir1_0a.pdf])" #. type: Plain text #: documentation/content/en/books/arch-handbook/usb/_index.adoc:71 @@ -256,8 +256,8 @@ "(классы) устройств. Эти драйверы реализуют протокол, используемый в каналах, " "отличных от стандартного. Они также реализуют дополнительную " "функциональность для обеспечения доступа к устройству другим частям ядра или " -"пользовательского пространства. Они используют интерфейс драйвера USB " -"(USBDI), предоставляемый уровнем сервисов." +"пользовательского пространства. Они используют интерфейс драйвера USB (USBDI)" +", предоставляемый уровнем сервисов." #. type: Title == #: documentation/content/en/books/arch-handbook/usb/_index.adoc:81 @@ -338,28 +338,27 @@ "a more abstract interface doing a lot of work themselves." msgstr "" "Запросы устройств (управляющие передачи) к конечным точкам по умолчанию " -"являются особыми. Они состоят из двух или трёх фаз: SETUP, DATA " -"(опционально) и STATUS. Пакет настройки отправляется на устройство. Если " -"присутствует фаза данных, направление пакета(ов) данных указывается в пакете " -"настройки. Направление в фазе статуса противоположно направлению во время " -"фазы данных или IN, если фазы данных не было. Аппаратное обеспечение хост-" -"контроллера также предоставляет регистры с текущим состоянием корневых " -"портов и изменениями, произошедшими с момента последнего сброса регистра " -"изменений статуса. Доступ к этим регистрам предоставляется через " -"виртуализированный концентратор, как предложено в спецификации USB. " -"Виртуальный концентратор должен соответствовать классу устройств " -"концентратора, указанному в главе 11 этой спецификации. Он должен " -"предоставлять канал по умолчанию, через который можно отправлять запросы " -"устройств. Он возвращает стандартные и специфичные для класса концентратора " -"наборы дескрипторов. Также он должен предоставлять прерывающий канал, " -"сообщающий об изменениях, происходящих на его портах. В настоящее время " -"доступны две спецификации для хост-контроллеров: - Universal Host Controller " -"Interface (UHCI) от Intel и Open Host Controller Interface (OHCI) от Compaq, " -"Microsoft и National Semiconductor. Спецификация UHCI разработана для " -"уменьшения аппаратной сложности, требуя от драйвера хост-контроллера " -"предоставления полного расписания передач для каждого кадра. Контроллеры " -"типа OHCI гораздо более независимы, предоставляя более абстрактный интерфейс " -"и выполняя большую часть работы самостоятельно." +"являются особыми. Они состоят из двух или трёх фаз: SETUP, DATA (опционально)" +" и STATUS. Пакет настройки отправляется на устройство. Если присутствует " +"фаза данных, направление пакета(ов) данных указывается в пакете настройки. " +"Направление в фазе статуса противоположно направлению во время фазы данных " +"или IN, если фазы данных не было. Аппаратное обеспечение хост-контроллера " +"также предоставляет регистры с текущим состоянием корневых портов и " +"изменениями, произошедшими с момента последнего сброса регистра изменений " +"статуса. Доступ к этим регистрам предоставляется через виртуализированный " +"концентратор, как предложено в спецификации USB. Виртуальный концентратор " +"должен соответствовать классу устройств концентратора, указанному в главе 11 " +"этой спецификации. Он должен предоставлять канал по умолчанию, через который " +"можно отправлять запросы устройств. Он возвращает стандартные и специфичные " +"для класса концентратора наборы дескрипторов. Также он должен предоставлять " +"прерывающий канал, сообщающий об изменениях, происходящих на его портах. В " +"настоящее время доступны две спецификации для хост-контроллеров: - Universal " +"Host Controller Interface (UHCI) от Intel и Open Host Controller Interface " +"(OHCI) от Compaq, Microsoft и National Semiconductor. Спецификация UHCI " +"разработана для уменьшения аппаратной сложности, требуя от драйвера хост-" +"контроллера предоставления полного расписания передач для каждого кадра. " +"Контроллеры типа OHCI гораздо более независимы, предоставляя более " +"абстрактный интерфейс и выполняя большую часть работы самостоятельно." #. type: Title === #: documentation/content/en/books/arch-handbook/usb/_index.adoc:91 @@ -663,8 +662,8 @@ msgstr "" "Дескрипторы конечных точек: Адрес конечной точки, направление и тип, " "максимальный поддерживаемый размер пакета и частота опроса, если тип " -"является конечной точкой прерывания. Для конечной точки по умолчанию " -"(конечная точка 0) дескриптора не существует, и она никогда не учитывается в " +"является конечной точкой прерывания. Для конечной точки по умолчанию (" +"конечная точка 0) дескриптора не существует, и она никогда не учитывается в " "дескрипторе интерфейса." #. type: Plain text @@ -707,8 +706,8 @@ "Канальный обмен данными с конечными точками устройства осуществляется через " "так называемые *каналы*. Драйверы передают данные конечным точкам через " "канал и предоставляют функцию обратного вызова, которая вызывается при " -"завершении или сбое передачи (асинхронные передачи) или ожидают завершения " -"(синхронная передача). Передачи данных в конечную точку сериализуются в " +"завершении или сбое передачи (асинхронные передачи) или ожидают завершения (" +"синхронная передача). Передачи данных в конечную точку сериализуются в " "канале. Передача может завершиться успешно, завершиться с ошибкой или " "превысить время ожидания (если оно было задано). Существует два типа " "таймаутов для передач. Таймауты могут происходить из-за истечения времени на " diff --git a/documentation/content/ru/books/arch-handbook/vm/_index.adoc b/documentation/content/ru/books/arch-handbook/vm/_index.adoc --- a/documentation/content/ru/books/arch-handbook/vm/_index.adoc +++ b/documentation/content/ru/books/arch-handbook/vm/_index.adoc @@ -4,7 +4,7 @@ params: path: /books/arch-handbook/vm/ prev: books/arch-handbook/mac -showBookMenu: true +showBookMenu: 'true' tags: ["Virtual memory", "vm_page_t", "vm_object_t", "I/O", "KVM"] title: 'Глава 7. Система управления виртуальной памятью' weight: 8 diff --git a/documentation/content/ru/books/arch-handbook/vm/_index.po b/documentation/content/ru/books/arch-handbook/vm/_index.po --- a/documentation/content/ru/books/arch-handbook/vm/_index.po +++ b/documentation/content/ru/books/arch-handbook/vm/_index.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-14 22:43+0300\n" +"POT-Creation-Date: 2025-05-01 19:56-0300\n" "PO-Revision-Date: 2025-08-26 04:45+0000\n" "Last-Translator: Vladlen Popolitov \n" "Language-Team: Russian =20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" -#. type: Yaml Front Matter Hash Value: description +#. type: YAML Front Matter: description #: documentation/content/en/books/arch-handbook/vm/_index.adoc:1 #, no-wrap msgid "Virtual Memory System in FreeBSD" msgstr "Система управления виртуальной памятью во FreeBSD" -#. type: Yaml Front Matter Hash Value: title +#. type: YAML Front Matter: title #: documentation/content/en/books/arch-handbook/vm/_index.adoc:1 #, no-wrap msgid "Chapter 7. Virtual Memory System" @@ -112,8 +112,8 @@ "free pages must be maintained in order to accommodate page allocation at " "interrupt time." msgstr "" -"В общем случае каждая из очередей подкачки работает по принципу LRU " -"(наименее недавно использованная). Обычно страница изначально помещается в " +"В общем случае каждая из очередей подкачки работает по принципу LRU (" +"наименее недавно использованная). Обычно страница изначально помещается в " "зафиксированное или активное состояние. В зафиксированном состоянии " "страница, как правило, ассоциирована с какой-либо таблицей страниц. Система " "виртуальной памяти «состаривает» страницу, просматривая страницы в более " @@ -163,14 +163,13 @@ "перераспределения зависит от текущей нагрузки на память системы. Это " "перераспределение выполняется демоном выгрузки страниц (pageout daemon) и " "включает в себя очистку (laundering) грязных страниц (синхронизацию их с " -"резервным хранилищем), отслеживание активности страниц по ссылкам на них " -"(сброс их положения в очередях LRU или перемещение между очередями), " -"миграцию страниц между очередями при разбалансировке очередей и другие " -"действия. Система виртуальной памяти FreeBSD допускает определённое " -"количество сбоев повторной активации страниц, чтобы точнее определить, " -"насколько страница фактически активна или неактивна. Это позволяет принимать " -"более обоснованные решения о том, когда очищать или выгружать страницу в " -"файл подкачки." +"резервным хранилищем), отслеживание активности страниц по ссылкам на них (" +"сброс их положения в очередях LRU или перемещение между очередями), миграцию " +"страниц между очередями при разбалансировке очередей и другие действия. " +"Система виртуальной памяти FreeBSD допускает определённое количество сбоев " +"повторной активации страниц, чтобы точнее определить, насколько страница " +"фактически активна или неактивна. Это позволяет принимать более обоснованные " +"решения о том, когда очищать или выгружать страницу в файл подкачки." #. type: Title == #: documentation/content/en/books/arch-handbook/vm/_index.adoc:69 @@ -187,8 +186,8 @@ "the same VM objects to manage in-core data relating to files, the result is " "a unified buffer cache." msgstr "" -"FreeBSD реализует концепцию универсального «объекта виртуальной памяти» (VM-" -"объекта). VM-объекты могут быть связаны с резервным хранилищем различных " +"FreeBSD реализует концепцию универсального «объекта виртуальной памяти» " +"(VM-объекта). VM-объекты могут быть связаны с резервным хранилищем различных " "типов: без резервного хранилища, с подкачкой, с физическим устройством или с " "файловым хранилищем. Поскольку файловая система использует те же VM-объекты " "для управления данными в оперативной памяти, связанными с файлами, в " @@ -315,8 +314,8 @@ "FreeBSD разделяет топологию физических таблиц страниц от системы виртуальной " "памяти. Все основные таблицы страниц, связанные с каждым процессом, могут " "быть восстановлены динамически и обычно считаются временными (throwaway). " -"Специальные таблицы страниц, такие как те, которые управляют KVM " -"(виртуальной памятью ядра), обычно предварительно выделяются навсегда. Эти " +"Специальные таблицы страниц, такие как те, которые управляют KVM (" +"виртуальной памятью ядра), обычно предварительно выделяются навсегда. Эти " "таблицы страниц не являются временными." #. type: Plain text @@ -513,8 +512,8 @@ msgstr "" "Настройка виртуальной памяти (VM) и системы во время работы относительно " "проста. Во-первых, используйте Soft Updates на ваших файловых системах UFS/" -"FFS, когда это возможно. Файл [.filename]#/usr/src/sys/ufs/ffs/" -"README.softupdates# содержит инструкции (и ограничения) по конфигурации этой " +"FFS, когда это возможно. Файл [.filename]#/usr/src/sys/ufs/ffs/README." +"softupdates# содержит инструкции (и ограничения) по конфигурации этой " "функции." #. type: Plain text