diff options
Diffstat (limited to 'documentation/content/ru/articles/linux-emulation/_index.po')
| -rw-r--r-- | documentation/content/ru/articles/linux-emulation/_index.po | 221 |
1 files changed, 108 insertions, 113 deletions
diff --git a/documentation/content/ru/articles/linux-emulation/_index.po b/documentation/content/ru/articles/linux-emulation/_index.po index cb02ba5937..3dcc5aa8b9 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: 2024-01-17 20:35-0300\n" -"PO-Revision-Date: 2025-10-29 04:45+0000\n" +"POT-Creation-Date: 2025-11-08 16:17+0000\n" +"PO-Revision-Date: 2025-11-12 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" @@ -22,8 +22,7 @@ msgstr "" #: 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: title #: documentation/content/en/articles/linux-emulation/_index.adoc:1 @@ -59,8 +58,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 года в рамках программы " @@ -195,8 +194,8 @@ msgstr "" "идеи были использованы многими другими операционными системами по всему " "миру, образовав так называемые UNIX(R)-подобные операционные системы. В наши " "дни наиболее влиятельными из них являются Linux(R), Solaris и, возможно (в " -"некоторой степени), FreeBSD. Существуют корпоративные производные UNIX(R) (" -"AIX, HP-UX и т. д.), но они всё больше мигрируют на упомянутые системы. " +"некоторой степени), FreeBSD. Существуют корпоративные производные UNIX(R) " +"(AIX, HP-UX и т. д.), но они всё больше мигрируют на упомянутые системы. " "Давайте подведём итог типичным характеристикам UNIX(R)." #. type: Title ==== @@ -265,8 +264,8 @@ msgid "" "reaction like sending a _signal_ (division by zero)." msgstr "" "Еще один возможный способ взаимодействия — использование _прерывания_. " -"Прерывания происходят асинхронно после возникновения определенного события (" -"деление на ноль, ошибка страницы и т.д.). Прерывание может быть прозрачным " +"Прерывания происходят асинхронно после возникновения определенного события " +"(деление на ноль, ошибка страницы и т.д.). Прерывание может быть прозрачным " "для процесса (ошибка страницы) или привести к реакции, например, отправке " "_сигнала_ (деление на ноль)." @@ -314,9 +313,9 @@ msgstr "" "запущенный процесс может создать свою идентичную копию, используя системный " "вызов man:fork[2]. Были введены некоторые немного изменённые версии этого " "системного вызова, но базовая семантика остаётся той же. Каждый запущенный " -"процесс может превратиться в другой процесс, используя системный вызов " -"man:exec[3]. Были введены некоторые модификации этого системного вызова, но " -"все они служат одной и той же базовой цели. Процессы завершают своё " +"процесс может превратиться в другой процесс, используя системный вызов man:" +"exec[3]. Были введены некоторые модификации этого системного вызова, но все " +"они служат одной и той же базовой цели. Процессы завершают своё " "существование, вызывая системный вызов man:exit[2]. Каждый процесс " "идентифицируется уникальным номером, называемым PID. У каждого процесса есть " "определённый родитель (идентифицируемый его PID)." @@ -536,8 +535,8 @@ msgstr "" "которая является прослойкой в системном вызове man:execve[2]. Она использует " "структуру `sysentvec`, описывающую ABI исполняемого файла. Эта структура " "содержит такие элементы, как таблицу преобразования errno, таблицу " -"преобразования сигналов, различные функции для обработки системных вызовов (" -"исправление стека, создание дампов памяти и т.д.). Каждый ABI, который ядро " +"преобразования сигналов, различные функции для обработки системных вызовов " +"(исправление стека, создание дампов памяти и т.д.). Каждый ABI, который ядро " "FreeBSD поддерживает, должен определять эту структуру, так как она " "используется в дальнейшем в коде обработки системных вызовов и в некоторых " "других местах. Системные вызовы обрабатываются обработчиками прерываний, где " @@ -554,8 +553,8 @@ msgstr "Системные вызовы" #. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:209 msgid "" -"Syscalls on FreeBSD are issued by executing interrupt `0x80` with register " -"`%eax` set to a desired syscall number with arguments passed on the stack." +"Syscalls on FreeBSD are issued by executing interrupt `0x80` with register `" +"%eax` set to a desired syscall number with arguments passed on the stack." msgstr "" "Системные вызовы в FreeBSD выполняются путем прерывания `0x80` с " "установленным в регистре `%eax` номером нужного системного вызова и " @@ -798,10 +797,10 @@ msgstr "" "Большая часть разработки Linux(R) происходит в системе контроля версий Git. " "Git — это распределённая система, поэтому нет централизованного источника " "кода Linux(R), но некоторые ветви считаются основными и официальными. Схема " -"нумерации версий, используемая в Linux(R), состоит из четырёх чисел: " -"A.B.C.D. В настоящее время разработка ведётся в ветке 2.6.C.D, где C " -"обозначает мажорную версию, в которую добавляются или изменяются функции, а " -"D — минорную версию, предназначенную только для исправления ошибок." +"нумерации версий, используемая в Linux(R), состоит из четырёх чисел: A.B.C." +"D. В настоящее время разработка ведётся в ветке 2.6.C.D, где C обозначает " +"мажорную версию, в которую добавляются или изменяются функции, а D — " +"минорную версию, предназначенную только для исправления ошибок." #. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:277 @@ -936,8 +935,8 @@ 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 определяет " "набор флагов, которые влияют на поведение процесса клонирования в отношении " @@ -1064,7 +1063,7 @@ msgid "" msgstr "" "Для непоточных программ PID и TID совпадают. Для поточных программ первый " "поток имеет одинаковые PID и TID, а каждый созданный поток разделяет тот же " -"PID и получает уникальный TID (поскольку передается `CLONE_THREAD`), также " +"PID и получает уникальный TID (поскольку передаётся `CLONE_THREAD`), также " "родительский процесс общий для всех процессов, образующих эту поточную " "программу." @@ -1486,10 +1485,10 @@ msgstr "" "Атомарные операции реализуются через набор функций, выполняющих простые " "арифметические действия над операндами в памяти атомарным образом по " "отношению к внешним событиям (прерываниям, вытеснению и т. д.). Атомарные " -"операции могут гарантировать атомарность только для небольших типов данных (" -"порядка величины типа `.long` в архитектуре C), поэтому их следует редко " -"использовать напрямую в конечном коде, разве что для очень простых операций (" -"например, установки флага в битовой карте). На самом деле довольно просто и " +"операции могут гарантировать атомарность только для небольших типов данных " +"(порядка величины типа `.long` в архитектуре C), поэтому их следует редко " +"использовать напрямую в конечном коде, разве что для очень простых операций " +"(например, установки флага в битовой карте). На самом деле довольно просто и " "часто можно допустить семантическую ошибку, полагаясь только на атомарные " "операции (обычно называемые lock-less). Ядро FreeBSD предоставляет способ " "выполнения атомарных операций в сочетании с барьерами памяти. Барьеры памяти " @@ -1673,8 +1672,8 @@ msgstr "" "указанное рядом с типом блокировки), ему запрещено захватывать блокировки " "более высоких уровней, так как это нарушит заданную семантику пути. " "Например, если поток удерживает блокирующую блокировку (уровень 2), ему " -"разрешено захватывать спин-блокировку (уровень 1), но не спящую блокировку (" -"уровень 3), поскольку блокирующие блокировки предназначены для защиты более " +"разрешено захватывать спин-блокировку (уровень 1), но не спящую блокировку " +"(уровень 3), поскольку блокирующие блокировки предназначены для защиты более " "коротких путей, чем спящие блокировки (однако эти правила не касаются " "атомарных операций или барьеров планирования)." @@ -2173,7 +2172,7 @@ msgid "" "notably `clone`) uses a different order but it is luckily easy to fix by " "inserting a dummy parameter in the `linux_clone` prototype." msgstr "" -"Linux(R) передает аргументы системных вызовов через регистры (поэтому на " +"Linux(R) передаёт аргументы системных вызовов через регистры (поэтому на " "i386 ограничено 6 параметрами), тогда как FreeBSD использует стек. " "Подпрограмма Linux(R) `prepsyscall` должна копировать параметры из регистров " "в стек. Порядок регистров следующий: `%ebx`, `%ecx`, `%edx`, `%esi`, `%edi`" @@ -2304,8 +2303,7 @@ 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 @@ -2486,12 +2484,12 @@ msgstr "" "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 @@ -2621,15 +2619,15 @@ msgid "" "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#." +"Эмуляционный слой 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 @@ -2750,16 +2748,16 @@ msgid "" "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 @@ -2777,8 +2775,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." @@ -2883,8 +2881,8 @@ msgid "" msgstr "" "PID используется для идентификации процесса FreeBSD, к которому присоединена " "эта структура. `child_se_tid` и `child_clear_tid` используются для " -"копирования адреса TID при завершении и создании процесса. Указатель `shared`" -" указывает на структуру, разделяемую между потоками. Переменная " +"копирования адреса TID при завершении и создании процесса. Указатель " +"`shared` указывает на структуру, разделяемую между потоками. Переменная " "`pdeath_signal` определяет сигнал завершения родительского процесса, а " "указатель `threads` используется для связывания этой структуры со списком " "потоков. Структура `linux_emuldata_shared` выглядит следующим образом:" @@ -3006,8 +3004,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 @@ -3044,15 +3042,15 @@ msgstr "" "байт параметра `flags` является сигналом завершения для вновь созданного " "процесса. Параметр `stack`, если он не `NULL`, указывает, где находится стек " "потока, а если он `NULL`, предполагается копирование при записи стека " -"вызывающего процесса (т.е. делать то же, что делает обычная функция " -"man:fork[2]). Параметр `parent_tidptr` используется как адрес для " -"копирования PID процесса (т.е. идентификатора потока) после того, как " -"процесс достаточно инициализирован, но ещё не готов к выполнению. Параметр " -"`dummy` присутствует из-за очень странного соглашения о вызовах этого " -"системного вызова на i386. Он использует регистры напрямую и не позволяет " -"компилятору делать это, что приводит к необходимости использования " -"фиктивного системного вызова. Параметр `child_tidptr` используется как адрес " -"для копирования PID после завершения ветвления процесса и при его завершении." +"вызывающего процесса (т.е. делать то же, что делает обычная функция man:" +"fork[2]). Параметр `parent_tidptr` используется как адрес для копирования " +"PID процесса (т.е. идентификатора потока) после того, как процесс достаточно " +"инициализирован, но ещё не готов к выполнению. Параметр `dummy` присутствует " +"из-за очень странного соглашения о вызовах этого системного вызова на i386. " +"Он использует регистры напрямую и не позволяет компилятору делать это, что " +"приводит к необходимости использования фиктивного системного вызова. " +"Параметр `child_tidptr` используется как адрес для копирования PID после " +"завершения ветвления процесса и при его завершении." #. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:1001 @@ -3095,11 +3093,11 @@ msgstr "" "эту возможность. Затем выполняется настройка `child_set_tid` и " "`child_clear_tid`, что активирует соответствующую функциональность далее в " "коде. На этом этапе мы копируем PID по адресу, указанному в `parent_tidptr`. " -"Установка стека процесса выполняется простой перезаписью регистра `%esp` " -"(`%rsp` на amd64) в кадре потока. Далее настраивается TLS для нового " -"процесса. После этого может быть эмулирована семантика man:vfork[2], и, " -"наконец, новый процесс помещается в очередь выполнения, а его PID " -"возвращается родительскому процессу через возвращаемое значение `clone`." +"Установка стека процесса выполняется простой перезаписью регистра `%esp` (`" +"%rsp` на amd64) в кадре потока. Далее настраивается TLS для нового процесса. " +"После этого может быть эмулирована семантика man:vfork[2], и, наконец, новый " +"процесс помещается в очередь выполнения, а его PID возвращается " +"родительскому процессу через возвращаемое значение `clone`." #. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:1004 @@ -3128,7 +3126,7 @@ msgid "" "manipulate `linux_emuldata_shared`. The `emul_lock` is a nonsleepable " "blocking mutex while `emul_shared_lock` is a sleepable blocking `sx_lock`. " "Due to of the per-subsystem locking we can coalesce some locks and that is " -"why the em find offers the non-locking access." +"why the em_find offers the non-locking access." msgstr "" "Блокировка реализована на уровне подсистем, поскольку не ожидается высокой " "конкуренции за эти ресурсы. Существует две блокировки: `emul_lock`, " @@ -3198,10 +3196,10 @@ msgstr "" "в данных, специфичных для конкретного потока, но доступных на уровне " "процесса. Например, имя выполняемого потока или что-то подобное. " "Традиционный API для работы с потоками в UNIX® — pthreads — предоставляет " -"способ сделать это через функции `man:pthread_key_create[3]`, " -"`man:pthread_setspecific[3]` и `man:pthread_getspecific[3]`, где поток может " -"создать ключ к локальным данным потока и использовать " -"`man:pthread_getspecific[3]` или `man:pthread_getspecific[3]` для управления " +"способ сделать это через функции `man:pthread_key_create[3]`, `man:" +"pthread_setspecific[3]` и `man:pthread_getspecific[3]`, где поток может " +"создать ключ к локальным данным потока и использовать `man:" +"pthread_getspecific[3]` или `man:pthread_getspecific[3]` для управления " "этими данными. Легко заметить, что это не самый удобный способ. Поэтому " "различные разработчики компиляторов C/C++ предложили более удобный метод. " "Они ввели новое ключевое слово `thread`, которое указывает, что переменная " @@ -3221,8 +3219,8 @@ msgstr "" "необходимость перезагружать сегмент при каждом переключении контекста, что " "может замедлять переключения. FreeBSD пытается минимизировать эти накладные " "расходы, используя только 1 дескриптор сегмента, в то время как Linux® " -"использует 3. Интересно, что почти ничто не использует больше 1 дескриптора (" -"только Wine, кажется, использует 2), поэтому Linux® платит эту " +"использует 3. Интересно, что почти ничто не использует больше 1 дескриптора " +"(только Wine, кажется, использует 2), поэтому Linux® платит эту " "необязательную цену при переключении контекстов." #. type: Title ==== @@ -3244,9 +3242,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 @@ -3259,16 +3257,16 @@ msgstr "mov %edx,%gs:0x10\n" msgid "" "This will load the content of the `%edx` register into memory location " "0x1244. Some segment registers have a special use, for example `%cs` is " -"used for code segment and `%ss` is used for stack segment but `%fs` and " -"`%gs` are generally unused. Segments are either stored in a global GDT " -"table or in a local LDT table. LDT is accessed via an entry in the GDT. " -"The LDT can store more types of segments. LDT can be per process. Both " -"tables define up to 8191 entries." +"used for code segment and `%ss` is used for stack segment but `%fs` and `" +"%gs` are generally unused. Segments are either stored in a global GDT table " +"or in a local LDT table. LDT is accessed via an entry in the GDT. The LDT " +"can store more types of segments. LDT can be per process. Both tables " +"define up to 8191 entries." msgstr "" "Это загрузит содержимое регистра `%edx` в ячейку памяти по адресу 0x1244. " "Некоторые сегментные регистры имеют специальное назначение, например, `%cs` " -"используется для сегмента кода, а `%ss` — для сегмента стека, но `%fs` и " -"`%gs` обычно не используются. Сегменты хранятся либо в глобальной таблице " +"используется для сегмента кода, а `%ss` — для сегмента стека, но `%fs` и `" +"%gs` обычно не используются. Сегменты хранятся либо в глобальной таблице " "GDT, либо в локальной таблице LDT. Доступ к LDT осуществляется через запись " "в GDT. LDT может хранить больше типов сегментов. LDT может быть отдельной " "для каждого процесса. Обе таблицы определяют до 8191 записей." @@ -3295,7 +3293,7 @@ msgid "" msgstr "" "Существует два основных способа настройки TLS в Linux(R). Он может быть " "настроен при клонировании процесса с использованием системного вызова `clone`" -" или с помощью вызова `set_thread_area`. Когда процесс передает флаг " +" или с помощью вызова `set_thread_area`. Когда процесс передаёт флаг " "`CLONE_SETTLS` в `clone`, ядро ожидает, что память, на которую указывает " "регистр `%esi`, будет содержать пользовательское представление сегмента в " "Linux(R), которое преобразуется в машинное представление сегмента и " @@ -3361,7 +3359,7 @@ msgstr "" "пользовательском пространстве использует номер из дескриптора, но это " "работает в большинстве случаев (никогда не встречалось ситуации, когда это " "не срабатывало), так как процесс в пользовательском пространстве обычно " -"передает 1. Затем мы преобразуем дескриптор из формата Linux(R) в " +"передаёт 1. Затем мы преобразуем дескриптор из формата Linux(R) в " "машинозависимую форму (т.е. независимую от операционной системы) и копируем " "его в дескриптор сегмента, определенный FreeBSD. Наконец, мы можем загрузить " "его. Мы назначаем дескриптор PCB потока (блок управления процессом) и " @@ -3392,8 +3390,8 @@ msgstr "" "Реализация amd64 аналогична реализации i386, но изначально не использовался " "32-битный дескриптор сегмента для этой цели (поэтому даже нативные " "пользователи 32-битного TLS не работали), поэтому нам пришлось добавить " -"такой сегмент и реализовать его загрузку при каждом переключении контекста (" -"когда установлен флаг, сигнализирующий о использовании 32-битного режима). " +"такой сегмент и реализовать его загрузку при каждом переключении контекста " +"(когда установлен флаг, сигнализирующий о использовании 32-битного режима). " "Кроме этого, загрузка TLS точно такая же, только номера сегментов " "отличаются, а формат дескриптора и загрузка немного различаются." @@ -3538,9 +3536,7 @@ 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 @@ -3872,9 +3868,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. Это " @@ -4025,8 +4021,7 @@ 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 @@ -4093,13 +4088,13 @@ msgstr "" "Реализация выполнена путем изменения функции man:namei[9] (описанной выше) " "для приема дополнительного параметра `dirfd` в структуре `nameidata`, " "который указывает начальную точку для поиска пути вместо использования " -"текущей рабочей директории каждый раз. Преобразование `dirfd` из номера " +"текущего рабочего каталога каждый раз. Преобразование `dirfd` из номера " "файлового дескриптора в vnode выполняется в нативных *at-системных вызовах. " "Когда `dirfd` равен `AT_FDCWD`, запись `dvp` в структуре `nameidata` имеет " "значение `NULL`, но если `dirfd` представляет другой номер, мы получаем файл " "по этому дескриптору, проверяем его валидность и, если к нему прикреплен " "vnode, получаем этот vnode. Затем проверяем, является ли этот vnode " -"директорией. В самой функции man:namei[9] мы просто заменяем vnode `dvp` на " +"каталогом. В самой функции man:namei[9] мы просто заменяем vnode `dvp` на " "переменную `dp` в функции man:namei[9], которая определяет начальную точку. " "Функция man:namei[9] используется не напрямую, а через цепочку различных " "функций на разных уровнях. Например, `openat` работает следующим образом:" @@ -4170,8 +4165,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 для упрощения портирования приложений." @@ -4402,8 +4397,8 @@ msgstr "Литература" #. type: Plain text #: documentation/content/en/articles/linux-emulation/_index.adoc:1435 msgid "" -"Marshall Kirk McKusick - George V. Nevile-Neil. Design and Implementation of " -"the FreeBSD operating system. Addison-Wesley, 2005." +"Marshall Kirk McKusick - George V. Neville-Neil. Design and Implementation " +"of the FreeBSD operating system. Addison-Wesley, 2005." msgstr "" "Marshall Kirk McKusick - George V. Neville-Neil. Design and Implementation " "of the FreeBSD operating system. Addison-Wesley, 2005 год." |
