diff options
Diffstat (limited to 'documentation/content/ru/articles/linux-emulation')
| -rw-r--r-- | documentation/content/ru/articles/linux-emulation/_index.adoc | 10 | ||||
| -rw-r--r-- | documentation/content/ru/articles/linux-emulation/_index.po | 474 |
2 files changed, 244 insertions, 240 deletions
diff --git a/documentation/content/ru/articles/linux-emulation/_index.adoc b/documentation/content/ru/articles/linux-emulation/_index.adoc index 9d60209b00..322804579b 100644 --- a/documentation/content/ru/articles/linux-emulation/_index.adoc +++ b/documentation/content/ru/articles/linux-emulation/_index.adoc @@ -443,9 +443,9 @@ if (__predict_true(p->p_sysent != &elf_Linux(R)_sysvec)) * `fhold` - ссылается на обработчик файла [[md]] -== Слой эмуляции Linux(R) - машинно-зависимая часть +== Слой эмуляции Linux(R) - машинозависимая часть -В этом разделе рассматривается реализация слоя эмуляции Linux(R) в операционной системе FreeBSD. Сначала описывается машинно-зависимая часть, рассказывающая о том, как и где реализовано взаимодействие между пользовательским пространством и ядром. Рассматриваются системные вызовы, сигналы, ptrace, ловушки и исправление стека. Эта часть посвящена архитектуре i386, но написана в общем виде, поэтому другие архитектуры не должны сильно отличаться. Следующая часть — машинно-независимая часть Linuxulator. Этот раздел охватывает только i386 и обработку ELF. A.OUT устарел и не поддерживается. +В этом разделе рассматривается реализация слоя эмуляции Linux(R) в операционной системе FreeBSD. Сначала описывается машинозависимая часть, рассказывающая о том, как и где реализовано взаимодействие между пользовательским пространством и ядром. Рассматриваются системные вызовы, сигналы, ptrace, ловушки и исправление стека. Эта часть посвящена архитектуре i386, но написана в общем виде, поэтому другие архитектуры не должны сильно отличаться. Следующая часть — машинонезависимая часть Linuxulator. Этот раздел охватывает только i386 и обработку ELF. A.OUT устарел и не поддерживается. [[syscall-handling]] === Обработка системных вызовов @@ -576,9 +576,9 @@ translate_traps(int signal, int trap_code) Эмуляционный слой Linux(R) на i386 также поддерживает бинарные файлы Linux(R) в формате A.OUT. Почти всё, что описано в предыдущих разделах, должно быть реализовано для поддержки A.OUT (кроме перевода ловушек и отправки сигналов). Поддержка бинарных файлов A.OUT больше не поддерживается, в частности, эмуляция 2.6 с ними не работает, но это не вызывает никаких проблем, так как linux-base в портах, вероятно, вообще не поддерживает бинарные файлы A.OUT. Эта поддержка, скорее всего, будет удалена в будущем. Большая часть кода, необходимого для загрузки бинарных файлов Linux(R) A.OUT, находится в файле [.filename]#imgact_linux.c#. [[mi]] -== Слой эмуляции Linux(R) - машино-независимая часть +== Слой эмуляции Linux(R) - машинонезависимая часть -В этом разделе рассматривается машинно-независимая часть Linuxulator. Он охватывает инфраструктуру эмуляции, необходимую для эмуляции Linux(R) 2.6, реализацию thread local storage (TLS) (на i386) и фьютексы. Затем мы кратко обсуждаем некоторые системные вызовы. +В этом разделе рассматривается машинонезависимая часть Linuxulator. Он охватывает инфраструктуру эмуляции, необходимую для эмуляции Linux(R) 2.6, реализацию thread local storage (TLS) (на i386) и фьютексы. Затем мы кратко обсуждаем некоторые системные вызовы. [[nptl-desc]] === Описание NPTL @@ -713,7 +713,7 @@ mov %edx,%gs:0x10 [[tls-i386]] ===== i386 -Загрузка TLS для текущего потока происходит путем вызова `set_thread_area`, тогда как загрузка TLS для второго процесса в `clone` выполняется в отдельном блоке в `clone`. Эти две функции очень похожи. Единственное различие заключается в фактической загрузке сегмента GDT, которая происходит при следующем переключении контекста для вновь созданного процесса, в то время как `set_thread_area` должен загрузить его напрямую. Код в основном делает следующее. Он копирует дескриптор сегмента в формате Linux(R) из пользовательского пространства. Код проверяет номер дескриптора, но поскольку он различается между FreeBSD и Linux(R), мы немного имитируем его. Мы поддерживаем только индексы 6, 3 и -1. Число 6 — это оригинальный номер Linux(R), 3 — оригинальный номер FreeBSD, а -1 означает авто-выбор. Затем мы устанавливаем номер дескриптора на константу 3 и копируем его обратно в пользовательское пространство. Мы полагаемся на то, что процесс в пользовательском пространстве использует номер из дескриптора, но это работает в большинстве случаев (никогда не встречалось ситуации, когда это не срабатывало), так как процесс в пользовательском пространстве обычно передает 1. Затем мы преобразуем дескриптор из формата Linux(R) в машинно-зависимую форму (т.е. независимую от операционной системы) и копируем его в дескриптор сегмента, определенный FreeBSD. Наконец, мы можем загрузить его. Мы назначаем дескриптор PCB потока (блок управления процессом) и загружаем сегмент `%gs` с помощью `load_gs`. Эта загрузка должна выполняться в критической секции, чтобы ничто не могло нас прервать. Случай `CLONE_SETTLS` работает точно так же, только загрузка с помощью `load_gs` не выполняется. Сегмент, используемый для этого (сегмент номер 3), разделяется между процессами FreeBSD и Linux(R), поэтому слой эмуляции Linux(R) не добавляет накладных расходов по сравнению с обычным FreeBSD. +Загрузка TLS для текущего потока происходит путем вызова `set_thread_area`, тогда как загрузка TLS для второго процесса в `clone` выполняется в отдельном блоке в `clone`. Эти две функции очень похожи. Единственное различие заключается в фактической загрузке сегмента GDT, которая происходит при следующем переключении контекста для вновь созданного процесса, в то время как `set_thread_area` должен загрузить его напрямую. Код в основном делает следующее. Он копирует дескриптор сегмента в формате Linux(R) из пользовательского пространства. Код проверяет номер дескриптора, но поскольку он различается между FreeBSD и Linux(R), мы немного имитируем его. Мы поддерживаем только индексы 6, 3 и -1. Число 6 — это оригинальный номер Linux(R), 3 — оригинальный номер FreeBSD, а -1 означает авто-выбор. Затем мы устанавливаем номер дескриптора на константу 3 и копируем его обратно в пользовательское пространство. Мы полагаемся на то, что процесс в пользовательском пространстве использует номер из дескриптора, но это работает в большинстве случаев (никогда не встречалось ситуации, когда это не срабатывало), так как процесс в пользовательском пространстве обычно передает 1. Затем мы преобразуем дескриптор из формата Linux(R) в машинозависимую форму (т.е. независимую от операционной системы) и копируем его в дескриптор сегмента, определенный FreeBSD. Наконец, мы можем загрузить его. Мы назначаем дескриптор PCB потока (блок управления процессом) и загружаем сегмент `%gs` с помощью `load_gs`. Эта загрузка должна выполняться в критической секции, чтобы ничто не могло нас прервать. Случай `CLONE_SETTLS` работает точно так же, только загрузка с помощью `load_gs` не выполняется. Сегмент, используемый для этого (сегмент номер 3), разделяется между процессами FreeBSD и Linux(R), поэтому слой эмуляции Linux(R) не добавляет накладных расходов по сравнению с обычным FreeBSD. [[tls-amd64]] ===== amd64 diff --git a/documentation/content/ru/articles/linux-emulation/_index.po b/documentation/content/ru/articles/linux-emulation/_index.po index 0296103bc0..cb02ba5937 100644 --- a/documentation/content/ru/articles/linux-emulation/_index.po +++ b/documentation/content/ru/articles/linux-emulation/_index.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: FreeBSD Documentation VERSION\n" -"POT-Creation-Date: 2025-10-13 23:41+0300\n" -"PO-Revision-Date: 2025-10-03 04:45+0000\n" +"POT-Creation-Date: 2024-01-17 20:35-0300\n" +"PO-Revision-Date: 2025-10-29 04:45+0000\n" "Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n" "Language-Team: Russian <https://translate-dev.freebsd.org/projects/" "documentation/articleslinux-emulation_index/ru/>\n" @@ -18,13 +18,14 @@ msgstr "" "n%10<=4 && (n%100<10 || n%100>=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/articles/linux-emulation/_index.adoc:1 #, no-wrap msgid "A technical description about the internals of the Linux emulation layer in FreeBSD" -msgstr "Техническое описание внутреннего устройства слоя эмуляции Linux в FreeBSD" +msgstr "" +"Техническое описание внутреннего устройства слоя эмуляции Linux в FreeBSD" -#. type: Yaml Front Matter Hash Value: title +#. type: YAML Front Matter: title #: documentation/content/en/articles/linux-emulation/_index.adoc:1 #, no-wrap msgid "Linux® emulation in FreeBSD" @@ -36,12 +37,12 @@ msgstr "Эмуляция Linux® в FreeBSD" msgid "Linux(R) emulation in FreeBSD" msgstr "Эмуляция Linux(R) в FreeBSD" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:44 msgid "Abstract" msgstr "Аннотация" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:54 msgid "" "This masters thesis deals with updating the Linux(R) emulation layer (the so " @@ -58,8 +59,8 @@ msgid "" "We, the emulation development team, are working on making the Linux(R) 2.6 " "emulation the default emulation layer in FreeBSD." msgstr "" -"Эта магистерская диссертация посвящена обновлению слоя эмуляции Linux(R) " -"(так называемого _Linuxulator_). Задача состояла в обновлении слоя для " +"Эта магистерская диссертация посвящена обновлению слоя эмуляции Linux(R) (" +"так называемого _Linuxulator_). Задача состояла в обновлении слоя для " "соответствия функциональности Linux(R) 2.6. В качестве эталонной реализации " "было выбрано ядро Linux(R) 2.6.16. Концепция основана на реализации NetBSD. " "Большая часть работы была выполнена летом 2006 года в рамках программы " @@ -73,7 +74,7 @@ msgstr "" "разработчиков эмуляции, работаем над тем, чтобы сделать эмуляцию Linux(R) " "2.6 стандартным слоем эмуляции в FreeBSD." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:56 msgid "'''" msgstr "'''" @@ -84,7 +85,7 @@ msgstr "'''" msgid "Introduction" msgstr "Введение" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:67 msgid "" "In the last few years the open source UNIX(R) based operating systems " @@ -111,7 +112,7 @@ msgstr "" "пользователей. Это приводит к ситуации, когда для Linux(R) доступно " "множество проприетарных программ, которые не поддерживают FreeBSD." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:69 msgid "" "Naturally, a need for the ability to run Linux(R) binaries on a FreeBSD " @@ -122,7 +123,7 @@ msgstr "" "бинарников в системе FreeBSD, и именно этому посвящена данная работа: " "эмуляции ядра Linux(R) в операционной системе FreeBSD." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:72 msgid "" "During the Summer of 2006 Google Inc. sponsored a project which focused on " @@ -141,7 +142,7 @@ msgstr "" msgid "A look inside..." msgstr "Взгляд изнутри..." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:80 msgid "" "In this section we are going to describe every operating system in " @@ -163,7 +164,7 @@ msgstr "" msgid "What is UNIX(R)" msgstr "Что такое UNIX(R)" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:94 msgid "" "UNIX(R) is an operating system with a long history that has influenced " @@ -194,8 +195,8 @@ msgstr "" "идеи были использованы многими другими операционными системами по всему " "миру, образовав так называемые UNIX(R)-подобные операционные системы. В наши " "дни наиболее влиятельными из них являются Linux(R), Solaris и, возможно (в " -"некоторой степени), FreeBSD. Существуют корпоративные производные UNIX(R) " -"(AIX, HP-UX и т. д.), но они всё больше мигрируют на упомянутые системы. " +"некоторой степени), FreeBSD. Существуют корпоративные производные UNIX(R) (" +"AIX, HP-UX и т. д.), но они всё больше мигрируют на упомянутые системы. " "Давайте подведём итог типичным характеристикам UNIX(R)." #. type: Title ==== @@ -206,7 +207,7 @@ msgstr "" msgid "Technical details" msgstr "Технические детали" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:104 msgid "" "Every running program constitutes a process that represents a state of the " @@ -233,7 +234,7 @@ msgstr "" msgid "Communication between kernel and user space process" msgstr "Обмен данными между ядром и пользовательским процессом" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:114 msgid "" "Common UNIX(R) API defines a syscall as a way to issue commands from a user " @@ -255,7 +256,7 @@ msgstr "" "различными способами (зависит от реализации). Системные вызовы являются " "синхронными." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:118 msgid "" "Another possible way to communicate is by using a _trap_. Traps occur " @@ -264,8 +265,8 @@ msgid "" "reaction like sending a _signal_ (division by zero)." msgstr "" "Еще один возможный способ взаимодействия — использование _прерывания_. " -"Прерывания происходят асинхронно после возникновения определенного события " -"(деление на ноль, ошибка страницы и т.д.). Прерывание может быть прозрачным " +"Прерывания происходят асинхронно после возникновения определенного события (" +"деление на ноль, ошибка страницы и т.д.). Прерывание может быть прозрачным " "для процесса (ошибка страницы) или привести к реакции, например, отправке " "_сигнала_ (деление на ноль)." @@ -275,7 +276,7 @@ msgstr "" msgid "Communication between processes" msgstr "Обмен данными между процессами" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:125 msgid "" "There are other APIs (System V IPC, shared memory etc.) but the single most " @@ -296,7 +297,7 @@ msgstr "" msgid "Process management" msgstr "Управление процессами" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:137 msgid "" "Kernel instances are processed first in the system (so called init). Every " @@ -326,7 +327,7 @@ msgstr "" msgid "Thread management" msgstr "Управление потоками" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:145 msgid "" "Traditional UNIX(R) does not define any API nor implementation for " @@ -343,7 +344,7 @@ msgstr "" "всей группы потоков в один процесс с управлением потоками в пользовательском " "пространстве (потоки 1:N). Сравнение основных особенностей каждого подхода:" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:147 msgid "1:1 threading" msgstr "Потоки 1:1" @@ -372,7 +373,7 @@ msgstr "нет необходимости в обёртке системных msgid "can utilize multiple CPUs" msgstr "может использовать несколько процессоров" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:154 msgid "1:N threading" msgstr "Потоки 1:N" @@ -403,7 +404,7 @@ msgstr "не может использовать более одного CPU" msgid "What is FreeBSD?" msgstr "Что такое FreeBSD?" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:169 msgid "" "The FreeBSD project is one of the oldest open source operating systems " @@ -425,7 +426,7 @@ msgstr "" "своё имя благодаря либеральной лицензии. Другая группа создала операционную " "систему NetBSD с другими целями. Мы сосредоточимся на FreeBSD." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:174 msgid "" "FreeBSD is a modern UNIX(R)-based operating system with all the features of " @@ -445,42 +446,42 @@ msgstr "" "UNIX(R)-подобных операционных систем. По состоянию на декабрь 2006 года и " "разработку 7-CURRENT поддерживаются следующие функции эмуляции:" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:176 msgid "FreeBSD/i386 emulation on FreeBSD/amd64" msgstr "Совместимость FreeBSD/i386 на FreeBSD/amd64" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:177 msgid "FreeBSD/i386 emulation on FreeBSD/ia64" msgstr "FreeBSD/i386 эмуляция на FreeBSD/ia64" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:178 msgid "Linux(R)-emulation of Linux(R) operating system on FreeBSD" msgstr "Эмуляция Linux(R) операционной системы Linux(R) на FreeBSD" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:179 msgid "NDIS-emulation of Windows networking drivers interface" msgstr "NDIS-эмуляция интерфейса сетевых драйверов Windows" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:180 msgid "NetBSD-emulation of NetBSD operating system" msgstr "NetBSD-эмуляция операционной системы NetBSD" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:181 msgid "PECoff-support for PECoff FreeBSD executables" msgstr "Поддержка PECoff для исполняемых файлов FreeBSD в формате PECoff" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:182 msgid "SVR4-emulation of System V revision 4 UNIX(R)" msgstr "Эмуляция SVR4 System V revision 4 UNIX(R)" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:185 msgid "" "Actively developed emulations are the Linux(R) layer and various FreeBSD-on-" @@ -491,7 +492,7 @@ msgstr "" "FreeBSD-on-FreeBSD. Остальные в настоящее время не должны работать корректно " "или быть пригодными к использованию." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:195 msgid "" "FreeBSD is traditional flavor of UNIX(R) in the sense of dividing the run of " @@ -518,7 +519,7 @@ msgstr "" msgid "System entries" msgstr "Системные записи" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:204 msgid "" "FreeBSD has an abstraction called an execution class loader, which is a " @@ -535,8 +536,8 @@ msgstr "" "которая является прослойкой в системном вызове man:execve[2]. Она использует " "структуру `sysentvec`, описывающую ABI исполняемого файла. Эта структура " "содержит такие элементы, как таблицу преобразования errno, таблицу " -"преобразования сигналов, различные функции для обработки системных вызовов " -"(исправление стека, создание дампов памяти и т.д.). Каждый ABI, который ядро " +"преобразования сигналов, различные функции для обработки системных вызовов (" +"исправление стека, создание дампов памяти и т.д.). Каждый ABI, который ядро " "FreeBSD поддерживает, должен определять эту структуру, так как она " "используется в дальнейшем в коде обработки системных вызовов и в некоторых " "других местах. Системные вызовы обрабатываются обработчиками прерываний, где " @@ -550,7 +551,7 @@ msgstr "" msgid "Syscalls" msgstr "Системные вызовы" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:209 msgid "" "Syscalls on FreeBSD are issued by executing interrupt `0x80` with register " @@ -560,7 +561,7 @@ msgstr "" "установленным в регистре `%eax` номером нужного системного вызова и " "аргументами, переданными через стек." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:215 msgid "" "When a process issues an interrupt `0x80`, the `int0x80` syscall trap " @@ -602,7 +603,7 @@ msgstr "" msgid "Traps" msgstr "Ловушки (trap)" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:224 msgid "" "Handling of traps in FreeBSD is similar to the handling of syscalls. " @@ -629,7 +630,7 @@ msgstr "" msgid "Exits" msgstr "Выходы" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:230 msgid "" "Exits from kernel to userspace happen using the assembler routine `doreti` " @@ -648,7 +649,7 @@ msgstr "" msgid "UNIX(R) primitives" msgstr "Примитивы UNIX(R)" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:238 msgid "" "FreeBSD operating system adheres to the traditional UNIX(R) scheme, where " @@ -665,7 +666,7 @@ msgstr "" "осуществляется с помощью линейного поиска в пространстве PID. Каждый поток в " "процессе получает тот же номер PID в результате вызова man:getpid[2]." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:249 msgid "" "There are currently two ways to implement threading in FreeBSD. The first " @@ -700,7 +701,7 @@ msgstr "" "обработка этого идентификатора внутренняя для библиотеки и не может быть " "использована напрямую." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:257 msgid "" "As stated previously there are two implementations of threading in FreeBSD. " @@ -734,7 +735,7 @@ msgstr "" msgid "What is Linux(R)" msgstr "Что такое Linux(R)" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:263 msgid "" "Linux(R) is a UNIX(R)-like kernel originally developed by Linus Torvalds, " @@ -751,7 +752,7 @@ msgstr "" "разработки, полной поддержкой оборудования и моделью организации по принципу " "\"доброжелательного диктатора\"." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:267 msgid "" "Linux(R) development started in 1991 as a hobbyist project at University of " @@ -767,7 +768,7 @@ msgstr "" "в общем, всё необходимое. Также присутствуют высокоуровневые функции, такие " "как виртуализация и т. д." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:270 msgid "" "As of 2006 Linux(R) seems to be the most widely used open source operating " @@ -783,7 +784,7 @@ msgstr "" "доступна только в бинарном виде, поэтому перекомпиляция для других " "операционных систем невозможна." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:275 msgid "" "Most of the Linux(R) development happens in a Git version control system. " @@ -802,12 +803,12 @@ msgstr "" "обозначает мажорную версию, в которую добавляются или изменяются функции, а " "D — минорную версию, предназначенную только для исправления ошибок." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:277 msgid "More information can be obtained from [3]." msgstr "Дополнительную информацию можно получить из [3]." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:286 msgid "" "Linux(R) follows the traditional UNIX(R) scheme of dividing the run of a " @@ -822,7 +823,7 @@ msgstr "" "осуществляется только одним способом. Далее описание относится к Linux(R) " "2.6 на архитектуре i386(TM). Эта информация взята из [2]." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:296 msgid "" "Syscalls in Linux(R) are performed (in userspace) using `syscallX` macros " @@ -849,37 +850,37 @@ msgstr "" "предполагает передачу параметров системного вызова через регистры, как " "показано здесь:" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:298 msgid "parameter -> `%ebx`" msgstr "параметр -> `%ebx`" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:299 msgid "parameter -> `%ecx`" msgstr "параметр -> `%ecx`" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:300 msgid "parameter -> `%edx`" msgstr "параметр -> `%edx`" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:301 msgid "parameter -> `%esi`" msgstr "параметр -> `%esi`" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:302 msgid "parameter -> `%edi`" msgstr "параметр -> `%edi`" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:303 msgid "parameter -> `%ebp`" msgstr "параметр -> `%ebp`" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:305 msgid "" "There are some exceptions to this, where Linux(R) uses different calling " @@ -888,18 +889,18 @@ msgstr "" "Существуют некоторые исключения из этого правила, где Linux(R) использует " "другие соглашения о вызовах (наиболее примечателен системный вызов `clone`)." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:310 msgid "" "The trap handlers are introduced in [.filename]#arch/i386/kernel/traps.c# " "and most of these handlers live in [.filename]#arch/i386/kernel/entry.S#, " "where handling of the traps happens." msgstr "" -"Обработчики ловушек представлены в файле [.filename]#arch/i386/kernel/" -"traps.c#, а большинство этих обработчиков находятся в [.filename]#arch/i386/" -"kernel/entry.S#, где происходит обработка ловушек." +"Обработчики ловушек представлены в файле [.filename]#arch/i386/kernel/traps." +"c#, а большинство этих обработчиков находятся в [.filename]#arch/i386/kernel/" +"entry.S#, где происходит обработка ловушек." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:316 msgid "" "Return from the syscall is managed by syscall man:exit[3], which checks for " @@ -915,13 +916,13 @@ msgstr "" "восстанавливаются из стека, а процесс возвращается в пользовательское " "пространство." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:327 msgid "" "In the 2.6 version, the Linux(R) operating system redefined some of the " "traditional UNIX(R) primitives, notably PID, TID and thread. PID is defined " -"not to be unique for every process, so for some processes (threads) " -"man:getppid[2] returns the same value. Unique identification of process is " +"not to be unique for every process, so for some processes (threads) man:" +"getppid[2] returns the same value. Unique identification of process is " "provided by TID. This is because _NPTL_ (New POSIX(R) Thread Library) " "defines threads to be normal processes (so called 1:1 threading). Spawning " "a new process in Linux(R) 2.6 happens using the `clone` syscall (fork " @@ -935,83 +936,83 @@ msgstr "" "определяется не как уникальный для каждого процесса, поэтому для некоторых " "процессов (потоков) man:getppid[2] возвращает одинаковое значение. " "Уникальная идентификация процесса обеспечивается TID. Это связано с тем, что " -"_NPTL_ (New POSIX(R) Thread Library) определяет потоки как обычные процессы " -"(так называемая модель 1:1). Создание нового процесса в Linux(R) 2.6 " +"_NPTL_ (New POSIX(R) Thread Library) определяет потоки как обычные процессы (" +"так называемая модель 1:1). Создание нового процесса в Linux(R) 2.6 " "происходит с использованием системного вызова `clone` (варианты fork " "перереализованы с его использованием). Этот системный вызов clone определяет " "набор флагов, которые влияют на поведение процесса клонирования в отношении " "реализации потоков. Семантика немного размыта, так как нет единого флага, " "указывающего системному вызову создать поток." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:329 msgid "Implemented clone flags are:" msgstr "Реализованные флаги клонирования:" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:331 msgid "`CLONE_VM` - processes share their memory space" msgstr "`CLONE_VM` - процессы разделяют общее адресное пространство" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:332 msgid "`CLONE_FS` - share umask, cwd and namespace" msgstr "" "`CLONE_FS` — совместно использовать umask, текущий рабочий каталог и " "пространство имён" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:333 msgid "`CLONE_FILES` - share open files" msgstr "`CLONE_FILES` - совместно использовать открытые файлы" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:334 msgid "`CLONE_SIGHAND` - share signal handlers and blocked signals" msgstr "" "`CLONE_SIGHAND` - разделять обработчики сигналов и заблокированные сигналы" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:335 msgid "`CLONE_PARENT` - share parent" msgstr "`CLONE_PARENT` - использовать один процесс к качестве родительского" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:336 msgid "`CLONE_THREAD` - be thread (further explanation below)" msgstr "`CLONE_THREAD` — быть потоком (дальнейшие пояснения ниже)" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:337 msgid "`CLONE_NEWNS` - new namespace" msgstr "`CLONE_NEWNS` - новое пространство имен" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:338 msgid "`CLONE_SYSVSEM` - share SysV undo structures" msgstr "`CLONE_SYSVSEM` - совместное использование структур отмены SysV" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:339 msgid "`CLONE_SETTLS` - setup TLS at supplied address" msgstr "`CLONE_SETTLS` - настройка TLS по указанному адресу" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:340 msgid "`CLONE_PARENT_SETTID` - set TID in the parent" msgstr "`CLONE_PARENT_SETTID` - установить TID в родителе" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:341 msgid "`CLONE_CHILD_CLEARTID` - clear TID in the child" msgstr "`CLONE_CHILD_CLEARTID` - очистить TID в дочернем процессе" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:342 msgid "`CLONE_CHILD_SETTID` - set TID in the child" msgstr "`CLONE_CHILD_SETTID` - установить TID в дочернем процессе" -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:348 msgid "" "`CLONE_PARENT` sets the real parent to the parent of the caller. This is " @@ -1033,7 +1034,7 @@ msgstr "" "флагов `CLONE_*_*TID` устанавливает/сбрасывает предоставленный пользователем " "адрес в TID или 0." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:352 msgid "" "As you can see the `CLONE_THREAD` does most of the work and does not seem to " @@ -1052,7 +1053,7 @@ msgstr "" "разделение, так как glibc не использует его, и только ручное использование " "clone позволяет программисту получить доступ к этим возможностям." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:355 msgid "" "For non-threaded programs the PID and TID are the same. For threaded " @@ -1067,7 +1068,7 @@ msgstr "" "родительский процесс общий для всех процессов, образующих эту поточную " "программу." -#. type: .abstract-title +#. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:357 msgid "" "The code that implements man:pthread_create[3] in NPTL defines the clone " @@ -1271,8 +1272,8 @@ msgstr "" msgid "" "The same goes with the UNIX(R) API. Most programs can live with a very " "limited set of syscalls working. Those syscalls tend to be the oldest ones " -"(man:read[2]/man:write[2], man:fork[2] family, man:signal[3] handling, " -"man:exit[3], man:socket[2] API) hence it is easy to emulate because their " +"(man:read[2]/man:write[2], man:fork[2] family, man:signal[3] handling, man:" +"exit[3], man:socket[2] API) hence it is easy to emulate because their " "semantics is shared among all UNIX(R)es, which exist todays." msgstr "" "То же самое касается UNIX(R) API. Большинство программ могут работать с " @@ -1485,10 +1486,10 @@ msgstr "" "Атомарные операции реализуются через набор функций, выполняющих простые " "арифметические действия над операндами в памяти атомарным образом по " "отношению к внешним событиям (прерываниям, вытеснению и т. д.). Атомарные " -"операции могут гарантировать атомарность только для небольших типов данных " -"(порядка величины типа `.long` в архитектуре C), поэтому их следует редко " -"использовать напрямую в конечном коде, разве что для очень простых операций " -"(например, установки флага в битовой карте). На самом деле довольно просто и " +"операции могут гарантировать атомарность только для небольших типов данных (" +"порядка величины типа `.long` в архитектуре C), поэтому их следует редко " +"использовать напрямую в конечном коде, разве что для очень простых операций (" +"например, установки флага в битовой карте). На самом деле довольно просто и " "часто можно допустить семантическую ошибку, полагаясь только на атомарные " "операции (обычно называемые lock-less). Ядро FreeBSD предоставляет способ " "выполнения атомарных операций в сочетании с барьерами памяти. Барьеры памяти " @@ -1519,8 +1520,8 @@ msgid "" "even something like a spin-mutex is deprecated. Using the refcount " "interface for structures, where a mutex is already used is often wrong since " "we should probably close the reference counter in some already protected " -"paths. A manpage discussing refcount does not exist currently, just check " -"[.filename]#sys/refcount.h# for an overview of the existing API." +"paths. A manpage discussing refcount does not exist currently, just check [." +"filename]#sys/refcount.h# for an overview of the existing API." msgstr "" "Счетчики ссылок (refcounts) — это интерфейсы для работы с подсчетом ссылок. " "Они реализованы с использованием атомарных операций и предназначены для " @@ -1672,8 +1673,8 @@ msgstr "" "указанное рядом с типом блокировки), ему запрещено захватывать блокировки " "более высоких уровней, так как это нарушит заданную семантику пути. " "Например, если поток удерживает блокирующую блокировку (уровень 2), ему " -"разрешено захватывать спин-блокировку (уровень 1), но не спящую блокировку " -"(уровень 3), поскольку блокирующие блокировки предназначены для защиты более " +"разрешено захватывать спин-блокировку (уровень 1), но не спящую блокировку (" +"уровень 3), поскольку блокирующие блокировки предназначены для защиты более " "коротких путей, чем спящие блокировки (однако эти правила не касаются " "атомарных операций или барьеров планирования)." @@ -1975,11 +1976,11 @@ msgstr "namei" msgid "" "The man:namei[9] routine is a central entry point to pathname lookup and " "translation. It traverses the path point by point from the starting point " -"to the end point using lookup function, which is internal to VFS. The " -"man:namei[9] syscall can cope with symlinks, absolute and relative paths. " -"When a path is looked up using man:namei[9] it is inputed to the name cache. " -"This behavior can be suppressed. This routine is used all over the kernel " -"and its performance is very critical." +"to the end point using lookup function, which is internal to VFS. The man:" +"namei[9] syscall can cope with symlinks, absolute and relative paths. When " +"a path is looked up using man:namei[9] it is inputed to the name cache. This " +"behavior can be suppressed. This routine is used all over the kernel and " +"its performance is very critical." msgstr "" "Функция man:namei[9] является центральной точкой входа для поиска и " "преобразования путей. Она проходит по пути шаг за шагом от начальной до " @@ -2111,7 +2112,7 @@ msgstr "`fhold` - ссылается на обработчик файла" #: documentation/content/en/articles/linux-emulation/_index.adoc:658 #, no-wrap msgid "Linux(R) emulation layer -MD part" -msgstr "Слой эмуляции Linux(R) - машинно-зависимая часть" +msgstr "Слой эмуляции Linux(R) - машинозависимая часть" #. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:666 @@ -2126,12 +2127,12 @@ msgid "" "is obsolete and untested." msgstr "" "В этом разделе рассматривается реализация слоя эмуляции Linux(R) в " -"операционной системе FreeBSD. Сначала описывается машинно-зависимая часть, " +"операционной системе FreeBSD. Сначала описывается машинозависимая часть, " "рассказывающая о том, как и где реализовано взаимодействие между " "пользовательским пространством и ядром. Рассматриваются системные вызовы, " "сигналы, ptrace, ловушки и исправление стека. Эта часть посвящена " "архитектуре i386, но написана в общем виде, поэтому другие архитектуры не " -"должны сильно отличаться. Следующая часть — машинно-независимая часть " +"должны сильно отличаться. Следующая часть — машинонезависимая часть " "Linuxulator. Этот раздел охватывает только i386 и обработку ELF. A.OUT " "устарел и не поддерживается." @@ -2149,11 +2150,11 @@ msgid "" "a Linux(R) process running on FreeBSD issues a syscall, the general syscall " "routine calls linux prepsyscall routine for the Linux(R) ABI." msgstr "" -"Обработка системных вызовов в основном реализована в файле " -"[.filename]#linux_sysvec.c#, который покрывает большинство процедур, " -"указанных в структуре `sysentvec`. Когда процесс Linux(R), выполняющийся на " -"FreeBSD, делает системный вызов, общая процедура обработки системных вызовов " -"вызывает linux prepsyscall для ABI Linux(R)." +"Обработка системных вызовов в основном реализована в файле [." +"filename]#linux_sysvec.c#, который покрывает большинство процедур, указанных " +"в структуре `sysentvec`. Когда процесс Linux(R), выполняющийся на FreeBSD, " +"делает системный вызов, общая процедура обработки системных вызовов вызывает " +"linux prepsyscall для ABI Linux(R)." #. type: Title ==== #: documentation/content/en/articles/linux-emulation/_index.adoc:674 @@ -2175,11 +2176,10 @@ msgstr "" "Linux(R) передает аргументы системных вызовов через регистры (поэтому на " "i386 ограничено 6 параметрами), тогда как FreeBSD использует стек. " "Подпрограмма Linux(R) `prepsyscall` должна копировать параметры из регистров " -"в стек. Порядок регистров следующий: `%ebx`, `%ecx`, `%edx`, `%esi`, " -"`%edi`, `%ebp`. Однако это верно только для _большинства_ системных " -"вызовов. Некоторые (особенно `clone`) используют другой порядок, но это, к " -"счастью, легко исправить, добавив фиктивный параметр в прототип " -"`linux_clone`." +"в стек. Порядок регистров следующий: `%ebx`, `%ecx`, `%edx`, `%esi`, `%edi`" +", `%ebp`. Однако это верно только для _большинства_ системных вызовов. " +"Некоторые (особенно `clone`) используют другой порядок, но это, к счастью, " +"легко исправить, добавив фиктивный параметр в прототип `linux_clone`." #. type: Title ==== #: documentation/content/en/articles/linux-emulation/_index.adoc:683 @@ -2239,14 +2239,14 @@ msgstr "" #. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:708 msgid "" -"From [.filename]#syscalls.master# a script generates three files: " -"[.filename]#linux_syscall.h#, [.filename]#linux_proto.h# and " -"[.filename]#linux_sysent.c#. The [.filename]#linux_syscall.h# contains " +"From [.filename]#syscalls.master# a script generates three files: [." +"filename]#linux_syscall.h#, [.filename]#linux_proto.h# and [." +"filename]#linux_sysent.c#. The [.filename]#linux_syscall.h# contains " "definitions of syscall names and their numerical value, e.g.:" msgstr "" -"Из файла [.filename]#syscalls.master# скрипт генерирует три файла: " -"[.filename]#linux_syscall.h#, [.filename]#linux_proto.h# и " -"[.filename]#linux_sysent.c#. Файл [.filename]#linux_syscall.h# содержит " +"Из файла [.filename]#syscalls.master# скрипт генерирует три файла: [." +"filename]#linux_syscall.h#, [.filename]#linux_proto.h# и [." +"filename]#linux_sysent.c#. Файл [.filename]#linux_syscall.h# содержит " "определения имен системных вызовов и их числовых значений, например:" #. type: delimited block . 4 @@ -2304,7 +2304,8 @@ msgid "" "{ AS(close_args), (sy_call_t *)close, AUE_CLOSE, NULL, 0, 0 }, /* 6 = close */\n" msgstr "" "{ 0, (sy_call_t *)linux_fork, AUE_FORK, NULL, 0, 0 }, /* 2 = linux_fork */\n" -"{ AS(close_args), (sy_call_t *)close, AUE_CLOSE, NULL, 0, 0 }, /* 6 = close */\n" +"{ AS(close_args), (sy_call_t *)close, AUE_CLOSE, NULL, 0, 0 }, /* 6 = close " +"*/\n" #. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:737 @@ -2345,8 +2346,8 @@ msgstr "" "Слой эмуляции Linux(R) не является полным, так как некоторые системные " "вызовы реализованы неправильно, а некоторые не реализованы вовсе. В слое " "эмуляции используется механизм для пометки нереализованных системных вызовов " -"с помощью макроса `DUMMY`. Эти заглушки находятся в файле " -"[.filename]#linux_dummy.c# в форме `DUMMY(syscall);`, которые затем " +"с помощью макроса `DUMMY`. Эти заглушки находятся в файле [." +"filename]#linux_dummy.c# в форме `DUMMY(syscall);`, которые затем " "преобразуются в различные вспомогательные файлы системных вызовов, а их " "реализация сводится к выводу сообщения о том, что данный системный вызов не " "реализован. Прототип `UNIMPL` не используется, потому что мы хотим иметь " @@ -2470,8 +2471,8 @@ msgstr "" #. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:788 msgid "" -"Linux(R) emulation in FreeBSD implements the man:ptrace[2] facility in " -"[.filename]#linux_ptrace.c#. The routines for converting registers between " +"Linux(R) emulation in FreeBSD implements the man:ptrace[2] facility in [." +"filename]#linux_ptrace.c#. The routines for converting registers between " "Linux(R) and FreeBSD and the actual man:ptrace[2] syscall emulation " "syscall. The syscall is a long switch block that implements its counterpart " "in FreeBSD for every man:ptrace[2] command. The man:ptrace[2] commands are " @@ -2481,16 +2482,16 @@ msgid "" "(native) man:ptrace[2] syscall, a copyout must be done to preserve Linux(R) " "semantics." msgstr "" -"Эмуляция Linux(R) в FreeBSD реализует механизм man:ptrace[2] в файле " -"[.filename]#linux_ptrace.c#. Функции для преобразования регистров между " +"Эмуляция Linux(R) в FreeBSD реализует механизм man:ptrace[2] в файле [." +"filename]#linux_ptrace.c#. Функции для преобразования регистров между " "Linux(R) и FreeBSD и фактический системный вызов эмуляции man:ptrace[2]. " "Системный вызов представляет собой длинный блок switch, который реализует " -"свой аналог в FreeBSD для каждой команды man:ptrace[2]. Команды " -"man:ptrace[2] в основном одинаковы между Linux(R) и FreeBSD, поэтому обычно " -"требуется лишь небольшая модификация. Например, `PT_GETREGS` в Linux(R) " -"работает с непосредственными данными, в то время как FreeBSD использует " -"указатель на данные, поэтому после выполнения (нативного) системного вызова " -"man:ptrace[2] необходимо выполнить copyout для сохранения семантики Linux(R)." +"свой аналог в FreeBSD для каждой команды man:ptrace[2]. Команды man:ptrace[2]" +" в основном одинаковы между Linux(R) и FreeBSD, поэтому обычно требуется " +"лишь небольшая модификация. Например, `PT_GETREGS` в Linux(R) работает с " +"непосредственными данными, в то время как FreeBSD использует указатель на " +"данные, поэтому после выполнения (нативного) системного вызова man:ptrace[2] " +"необходимо выполнить copyout для сохранения семантики Linux(R)." #. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:792 @@ -2617,24 +2618,24 @@ msgid "" "especially the 2.6 emulation does not work with it but this does not cause " "any problem, as the linux-base in ports probably do not support A.OUT " "binaries at all. This support will probably be removed in future. Most of " -"the stuff necessary for loading Linux(R) A.OUT binaries is in " -"[.filename]#imgact_linux.c# file." -msgstr "" -"Эмуляционный слой Linux(R) на i386 также поддерживает бинарные файлы " -"Linux(R) в формате A.OUT. Почти всё, что описано в предыдущих разделах, " -"должно быть реализовано для поддержки A.OUT (кроме перевода ловушек и " -"отправки сигналов). Поддержка бинарных файлов A.OUT больше не " -"поддерживается, в частности, эмуляция 2.6 с ними не работает, но это не " -"вызывает никаких проблем, так как linux-base в портах, вероятно, вообще не " -"поддерживает бинарные файлы A.OUT. Эта поддержка, скорее всего, будет " -"удалена в будущем. Большая часть кода, необходимого для загрузки бинарных " -"файлов Linux(R) A.OUT, находится в файле [.filename]#imgact_linux.c#." +"the stuff necessary for loading Linux(R) A.OUT binaries is in [." +"filename]#imgact_linux.c# file." +msgstr "" +"Эмуляционный слой Linux(R) на i386 также поддерживает бинарные файлы Linux(R)" +" в формате A.OUT. Почти всё, что описано в предыдущих разделах, должно быть " +"реализовано для поддержки A.OUT (кроме перевода ловушек и отправки сигналов)" +". Поддержка бинарных файлов A.OUT больше не поддерживается, в частности, " +"эмуляция 2.6 с ними не работает, но это не вызывает никаких проблем, так как " +"linux-base в портах, вероятно, вообще не поддерживает бинарные файлы A.OUT. " +"Эта поддержка, скорее всего, будет удалена в будущем. Большая часть кода, " +"необходимого для загрузки бинарных файлов Linux(R) A.OUT, находится в файле [" +".filename]#imgact_linux.c#." #. type: Title == #: documentation/content/en/articles/linux-emulation/_index.adoc:842 #, no-wrap msgid "Linux(R) emulation layer -MI part" -msgstr "Слой эмуляции Linux(R) - машино-независимая часть" +msgstr "Слой эмуляции Linux(R) - машинонезависимая часть" #. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:847 @@ -2644,7 +2645,7 @@ msgid "" "thread local storage (TLS) implementation (on i386) and futexes. Then we " "talk briefly about some syscalls." msgstr "" -"В этом разделе рассматривается машинно-независимая часть Linuxulator. Он " +"В этом разделе рассматривается машинонезависимая часть Linuxulator. Он " "охватывает инфраструктуру эмуляции, необходимую для эмуляции Linux(R) 2.6, " "реализацию thread local storage (TLS) (на i386) и фьютексы. Затем мы кратко " "обсуждаем некоторые системные вызовы." @@ -2738,27 +2739,27 @@ msgstr "Определение эмуляции 2.6 во время выполн #: documentation/content/en/articles/linux-emulation/_index.adoc:883 msgid "" "The Linux(R) emulation layer in FreeBSD supports runtime setting of the " -"emulated version. This is done via man:sysctl[8], namely " -"`compat.linux.osrelease`. Setting this man:sysctl[8] affects runtime " -"behavior of the emulation layer. When set to 2.6.x it sets the value of " -"`linux_use_linux26` while setting to something else keeps it unset. This " -"variable (plus per-prison variables of the very same kind) determines " -"whether 2.6 infrastructure (mainly PID mangling) is used in the code or " -"not. The version setting is done system-wide and this affects all Linux(R) " +"emulated version. This is done via man:sysctl[8], namely `compat.linux." +"osrelease`. Setting this man:sysctl[8] affects runtime behavior of the " +"emulation layer. When set to 2.6.x it sets the value of `linux_use_linux26` " +"while setting to something else keeps it unset. This variable (plus per-" +"prison variables of the very same kind) determines whether 2.6 " +"infrastructure (mainly PID mangling) is used in the code or not. The " +"version setting is done system-wide and this affects all Linux(R) " "processes. The man:sysctl[8] should not be changed when running any " "Linux(R) binary as it might harm things." msgstr "" "Слой эмуляции Linux(R) в FreeBSD поддерживает динамическую настройку " -"эмулируемой версии. Это выполняется с помощью man:sysctl[8], а именно " -"`compat.linux.osrelease`. Установка этого man:sysctl[8] влияет на поведение " -"слоя эмуляции во время выполнения. При установке значения 2.6.x " -"устанавливается переменная `linux_use_linux26`, а при установке другого " -"значения она остаётся сброшенной. Эта переменная (а также аналогичные " -"переменные для каждой клетки) определяет, используется ли в коде " -"инфраструктура 2.6 (в основном, преобразование PID). Настройка версии " -"применяется глобально для всей системы и влияет на все процессы Linux(R). Не " -"следует изменять man:sysctl[8] во время выполнения любого бинарного файла " -"Linux(R), так как это может привести к проблемам." +"эмулируемой версии. Это выполняется с помощью man:sysctl[8], а именно `compat" +".linux.osrelease`. Установка этого man:sysctl[8] влияет на поведение слоя " +"эмуляции во время выполнения. При установке значения 2.6.x устанавливается " +"переменная `linux_use_linux26`, а при установке другого значения она " +"остаётся сброшенной. Эта переменная (а также аналогичные переменные для " +"каждой клетки) определяет, используется ли в коде инфраструктура 2.6 (в " +"основном, преобразование PID). Настройка версии применяется глобально для " +"всей системы и влияет на все процессы Linux(R). Не следует изменять " +"man:sysctl[8] во время выполнения любого бинарного файла Linux(R), так как " +"это может привести к проблемам." #. type: Title ==== #: documentation/content/en/articles/linux-emulation/_index.adoc:885 @@ -2776,8 +2777,8 @@ msgid "" "other words a process. For single-threaded process the PID equals the TGID." msgstr "" "Семантика потоков в Linux(R) немного запутанная и использует совершенно " -"другую терминологию по сравнению с FreeBSD. Процесс в Linux(R) состоит из " -"`struct task`, включающей два поля идентификаторов — PID и TGID. PID — это " +"другую терминологию по сравнению с FreeBSD. Процесс в Linux(R) состоит из `" +"struct task`, включающей два поля идентификаторов — PID и TGID. PID — это " "_не_ идентификатор процесса, а идентификатор потока. TGID идентифицирует " "группу потоков, другими словами, процесс. Для однопоточного процесса PID " "равен TGID." @@ -2882,8 +2883,8 @@ msgid "" msgstr "" "PID используется для идентификации процесса FreeBSD, к которому присоединена " "эта структура. `child_se_tid` и `child_clear_tid` используются для " -"копирования адреса TID при завершении и создании процесса. Указатель " -"`shared` указывает на структуру, разделяемую между потоками. Переменная " +"копирования адреса TID при завершении и создании процесса. Указатель `shared`" +" указывает на структуру, разделяемую между потоками. Переменная " "`pdeath_signal` определяет сигнал завершения родительского процесса, а " "указатель `threads` используется для связывания этой структуры со списком " "потоков. Структура `linux_emuldata_shared` выглядит следующим образом:" @@ -3005,8 +3006,8 @@ msgid "" "The `clone` syscall is the way threads are created in Linux(R). The syscall " "prototype looks like this:" msgstr "" -"`clone` — это системный вызов, с помощью которого создаются потоки в " -"Linux(R). Прототип системного вызова выглядит следующим образом:" +"`clone` — это системный вызов, с помощью которого создаются потоки в Linux(R)" +". Прототип системного вызова выглядит следующим образом:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-emulation/_index.adoc:977 @@ -3072,10 +3073,10 @@ msgid "" "the functionality later in the code. At this point we copy out the PID to " "the address specified by `parent_tidptr`. The setting of process stack is " "done by simply rewriting thread frame `%esp` register (`%rsp` on amd64). " -"Next part is setting up TLS for the newly created process. After this " -"man:vfork[2] semantics might be emulated and finally the newly created " -"process is put on a run queue and copying out its PID to the parent process " -"via `clone` return value is done." +"Next part is setting up TLS for the newly created process. After this man:" +"vfork[2] semantics might be emulated and finally the newly created process " +"is put on a run queue and copying out its PID to the parent process via " +"`clone` return value is done." msgstr "" "Системный вызов продолжает выполнение, устанавливая соответствующие флаги в " "зависимости от переданных аргументов. Например, `CLONE_VM` преобразуется в " @@ -3103,9 +3104,9 @@ msgstr "" #. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:1004 msgid "" -"The `clone` syscall is able and in fact is used for emulating classic " -"man:fork[2] and man:vfork[2] syscalls. Newer glibc in a case of 2.6 kernel " -"uses `clone` to implement man:fork[2] and man:vfork[2] syscalls." +"The `clone` syscall is able and in fact is used for emulating classic man:" +"fork[2] and man:vfork[2] syscalls. Newer glibc in a case of 2.6 kernel uses " +"`clone` to implement man:fork[2] and man:vfork[2] syscalls." msgstr "" "Системный вызов `clone` способен и фактически используется для эмуляции " "классических системных вызовов man:fork[2] и man:vfork[2]. Более новые " @@ -3131,9 +3132,9 @@ msgid "" msgstr "" "Блокировка реализована на уровне подсистем, поскольку не ожидается высокой " "конкуренции за эти ресурсы. Существует две блокировки: `emul_lock`, " -"используемая для защиты манипуляций с `linux_emuldata`, и " -"`emul_shared_lock`, используемая для манипуляций с `linux_emuldata_shared`. " -"`emul_lock` представляет собой неспящий блокирующий мьютекс, в то время как " +"используемая для защиты манипуляций с `linux_emuldata`, и `emul_shared_lock`" +", используемая для манипуляций с `linux_emuldata_shared`. `emul_lock` " +"представляет собой неспящий блокирующий мьютекс, в то время как " "`emul_shared_lock` — это спящий блокирующий `sx_lock`. Благодаря блокировке " "на уровне подсистем мы можем объединять некоторые блокировки, поэтому " "em_find предлагает доступ без блокировки." @@ -3165,30 +3166,30 @@ msgid "" "their own data. Sometimes there is a need for process-wide data specific to " "a given thread. Imagine a name of the thread in execution or something like " "that. The traditional UNIX(R) threading API, pthreads provides a way to do " -"it via man:pthread_key_create[3], man:pthread_setspecific[3] and " -"man:pthread_getspecific[3] where a thread can create a key to the thread " -"local data and using man:pthread_getspecific[3] or " -"man:pthread_getspecific[3] to manipulate those data. You can easily see " -"that this is not the most comfortable way this could be accomplished. So " -"various producers of C/C++ compilers introduced a better way. They defined " -"a new modifier keyword thread that specifies that a variable is thread " -"specific. A new method of accessing such variables was developed as well " -"(at least on i386). The pthreads method tends to be implemented in " -"userspace as a trivial lookup table. The performance of such a solution is " -"not very good. So the new method uses (on i386) segment registers to " -"address a segment, where TLS area is stored so the actual accessing of a " -"thread variable is just appending the segment register to the address thus " -"addressing via it. The segment registers are usually `%gs` and `%fs` acting " -"like segment selectors. Every thread has its own area where the thread " -"local data are stored and the segment must be loaded on every context " -"switch. This method is very fast and used almost exclusively in the whole " -"i386 UNIX(R) world. Both FreeBSD and Linux(R) implement this approach and " -"it yields very good results. The only drawback is the need to reload the " -"segment on every context switch which can slowdown context switches. " -"FreeBSD tries to avoid this overhead by using only 1 segment descriptor for " -"this while Linux(R) uses 3. Interesting thing is that almost nothing uses " -"more than 1 descriptor (only Wine seems to use 2) so Linux(R) pays this " -"unnecessary price for context switches." +"it via man:pthread_key_create[3], man:pthread_setspecific[3] and man:" +"pthread_getspecific[3] where a thread can create a key to the thread local " +"data and using man:pthread_getspecific[3] or man:pthread_getspecific[3] to " +"manipulate those data. You can easily see that this is not the most " +"comfortable way this could be accomplished. So various producers of C/C++ " +"compilers introduced a better way. They defined a new modifier keyword " +"thread that specifies that a variable is thread specific. A new method of " +"accessing such variables was developed as well (at least on i386). The " +"pthreads method tends to be implemented in userspace as a trivial lookup " +"table. The performance of such a solution is not very good. So the new " +"method uses (on i386) segment registers to address a segment, where TLS area " +"is stored so the actual accessing of a thread variable is just appending the " +"segment register to the address thus addressing via it. The segment " +"registers are usually `%gs` and `%fs` acting like segment selectors. Every " +"thread has its own area where the thread local data are stored and the " +"segment must be loaded on every context switch. This method is very fast " +"and used almost exclusively in the whole i386 UNIX(R) world. Both FreeBSD " +"and Linux(R) implement this approach and it yields very good results. The " +"only drawback is the need to reload the segment on every context switch " +"which can slowdown context switches. FreeBSD tries to avoid this overhead " +"by using only 1 segment descriptor for this while Linux(R) uses 3. " +"Interesting thing is that almost nothing uses more than 1 descriptor (only " +"Wine seems to use 2) so Linux(R) pays this unnecessary price for context " +"switches." msgstr "" "В компьютерных науках потоки (threads) — это сущности внутри процесса, " "которые могут планироваться независимо друг от друга. Потоки в процессе " @@ -3220,8 +3221,8 @@ msgstr "" "необходимость перезагружать сегмент при каждом переключении контекста, что " "может замедлять переключения. FreeBSD пытается минимизировать эти накладные " "расходы, используя только 1 дескриптор сегмента, в то время как Linux® " -"использует 3. Интересно, что почти ничто не использует больше 1 дескриптора " -"(только Wine, кажется, использует 2), поэтому Linux® платит эту " +"использует 3. Интересно, что почти ничто не использует больше 1 дескриптора (" +"только Wine, кажется, использует 2), поэтому Linux® платит эту " "необязательную цену при переключении контекстов." #. type: Title ==== @@ -3243,9 +3244,9 @@ msgstr "" "Архитектура i386 реализует так называемые сегменты. Сегмент — это описание " "области памяти. Он включает базовый адрес (начало) области памяти, её конец " "(границу), тип, защиту и т.д. Доступ к памяти, описываемой сегментом, может " -"осуществляться с использованием регистров селекторов сегментов (`%cs`, " -"`%ds`, `%ss`, `%es`, `%fs`, `%gs`). Например, предположим, что у нас есть " -"сегмент с базовым адресом 0x1234 и длиной, а также следующий код:" +"осуществляться с использованием регистров селекторов сегментов (`%cs`, `%ds`" +", `%ss`, `%es`, `%fs`, `%gs`). Например, предположим, что у нас есть сегмент " +"с базовым адресом 0x1234 и длиной, а также следующий код:" #. type: delimited block . 4 #: documentation/content/en/articles/linux-emulation/_index.adoc:1053 @@ -3293,8 +3294,8 @@ msgid "" "entry. We exploit this in the emulation and in fact depend on it." msgstr "" "Существует два основных способа настройки TLS в Linux(R). Он может быть " -"настроен при клонировании процесса с использованием системного вызова " -"`clone` или с помощью вызова `set_thread_area`. Когда процесс передает флаг " +"настроен при клонировании процесса с использованием системного вызова `clone`" +" или с помощью вызова `set_thread_area`. Когда процесс передает флаг " "`CLONE_SETTLS` в `clone`, ядро ожидает, что память, на которую указывает " "регистр `%esi`, будет содержать пользовательское представление сегмента в " "Linux(R), которое преобразуется в машинное представление сегмента и " @@ -3360,16 +3361,16 @@ msgstr "" "пользовательском пространстве использует номер из дескриптора, но это " "работает в большинстве случаев (никогда не встречалось ситуации, когда это " "не срабатывало), так как процесс в пользовательском пространстве обычно " -"передает 1. Затем мы преобразуем дескриптор из формата Linux(R) в машинно-" -"зависимую форму (т.е. независимую от операционной системы) и копируем его в " -"дескриптор сегмента, определенный FreeBSD. Наконец, мы можем загрузить его. " -"Мы назначаем дескриптор PCB потока (блок управления процессом) и загружаем " -"сегмент `%gs` с помощью `load_gs`. Эта загрузка должна выполняться в " -"критической секции, чтобы ничто не могло нас прервать. Случай `CLONE_SETTLS` " -"работает точно так же, только загрузка с помощью `load_gs` не выполняется. " -"Сегмент, используемый для этого (сегмент номер 3), разделяется между " -"процессами FreeBSD и Linux(R), поэтому слой эмуляции Linux(R) не добавляет " -"накладных расходов по сравнению с обычным FreeBSD." +"передает 1. Затем мы преобразуем дескриптор из формата Linux(R) в " +"машинозависимую форму (т.е. независимую от операционной системы) и копируем " +"его в дескриптор сегмента, определенный FreeBSD. Наконец, мы можем загрузить " +"его. Мы назначаем дескриптор PCB потока (блок управления процессом) и " +"загружаем сегмент `%gs` с помощью `load_gs`. Эта загрузка должна выполняться " +"в критической секции, чтобы ничто не могло нас прервать. Случай " +"`CLONE_SETTLS` работает точно так же, только загрузка с помощью `load_gs` не " +"выполняется. Сегмент, используемый для этого (сегмент номер 3), разделяется " +"между процессами FreeBSD и Linux(R), поэтому слой эмуляции Linux(R) не " +"добавляет накладных расходов по сравнению с обычным FreeBSD." #. type: Title ===== #: documentation/content/en/articles/linux-emulation/_index.adoc:1097 @@ -3391,8 +3392,8 @@ msgstr "" "Реализация amd64 аналогична реализации i386, но изначально не использовался " "32-битный дескриптор сегмента для этой цели (поэтому даже нативные " "пользователи 32-битного TLS не работали), поэтому нам пришлось добавить " -"такой сегмент и реализовать его загрузку при каждом переключении контекста " -"(когда установлен флаг, сигнализирующий о использовании 32-битного режима). " +"такой сегмент и реализовать его загрузку при каждом переключении контекста (" +"когда установлен флаг, сигнализирующий о использовании 32-битного режима). " "Кроме этого, загрузка TLS точно такая же, только номера сегментов " "отличаются, а формат дескриптора и загрузка немного различаются." @@ -3537,7 +3538,9 @@ msgstr "Системный вызов futex выглядит следующим #: documentation/content/en/articles/linux-emulation/_index.adoc:1150 #, no-wrap msgid "int futex(void *uaddr, int op, int val, struct timespec *timeout, void *uaddr2, int val3);\n" -msgstr "int futex(void *uaddr, int op, int val, struct timespec *timeout, void *uaddr2, int val3);\n" +msgstr "" +"int futex(void *uaddr, int op, int val, struct timespec *timeout, void *" +"uaddr2, int val3);\n" #. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:1153 @@ -3869,9 +3872,9 @@ msgid "" "futex. This cooperates with `futex_sleep`." msgstr "" "Пробуждение потока, ожидающего на фьютексе, выполняется в функции " -"`futex_wake`. Сначала в этой функции мы имитируем странное поведение " -"Linux(R), где пробуждаются N потоков для всех операций, за исключением того, " -"что операции REQUEUE выполняются на N+1 потоках. Однако обычно это не имеет " +"`futex_wake`. Сначала в этой функции мы имитируем странное поведение Linux(R)" +", где пробуждаются N потоков для всех операций, за исключением того, что " +"операции REQUEUE выполняются на N+1 потоках. Однако обычно это не имеет " "значения, так как мы пробуждаем все потоки. Далее в функции в цикле мы " "пробуждаем n потоков, после чего проверяем, есть ли новый фьютекс для " "перестановки. Если есть, мы переставляем до n2 потоков на новый futex. Это " @@ -3889,8 +3892,8 @@ msgid "" "The `FUTEX_WAKE_OP` operation is quite complicated. First we obtain two " "futexes at addresses `uaddr` and `uaddr2` then we perform the atomic " "operation using `val3` and `uaddr2`. Then `val` waiters on the first futex " -"is woken up and if the atomic operation condition holds we wake up `val2` " -"(i.e. `timeout`) waiter on the second futex." +"is woken up and if the atomic operation condition holds we wake up `val2` (i." +"e. `timeout`) waiter on the second futex." msgstr "" "Операция `FUTEX_WAKE_OP` довольно сложна. Сначала мы получаем два фьютекса " "по адресам `uaddr` и `uaddr2`, затем выполняем атомарную операцию с " @@ -4022,7 +4025,8 @@ msgstr "" "openat(123, /tmp/bah\\, flags, mode)\t/* opens /tmp/bah */\n" "openat(123, bah\\, flags, mode)\t\t/* opens /tmp/foo/bah */\n" "openat(AT_FDWCWD, bah\\, flags, mode)\t/* opens /tmp/bah */\n" -"openat(stdio, bah\\, flags, mode)\t/* returns error because stdio is not a directory */\n" +"openat(stdio, bah\\, flags, mode)\t/* returns error because stdio is not a " +"directory */\n" #. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:1331 @@ -4166,8 +4170,8 @@ msgstr "" "обработчика. Существуют небольшие проблемы с этим подходом, поскольку " "Linux(R) не всегда последовательно использует разделение на наборы, поэтому " "иногда ioctls для другого набора оказываются внутри набора, к которому они " -"не должны принадлежать (например, SCSI generic ioctls внутри набора cdrom и " -"т.д.). В настоящее время FreeBSD реализует не так много ioctls Linux(R) (по " +"не должны принадлежать (например, SCSI generic ioctls внутри набора cdrom и т" +".д.). В настоящее время FreeBSD реализует не так много ioctls Linux(R) (по " "сравнению с NetBSD, например), но планируется перенести их из NetBSD. " "Тенденция такова, что ioctls Linux(R) используются даже в родных драйверах " "FreeBSD для упрощения портирования приложений." |
