.\" -*- coding: UTF-8 -*- .\" Copyright (C) 2003 Free Software Foundation, Inc. .\" Copyright (C) 2015 Andrew Lutomirski .\" Author: Kent Yoder .\" .\" SPDX-License-Identifier: GPL-1.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH set_thread_area 2 "2 мая 2024 г." "Справочные страницы Linux 6.9.1" .SH НАИМЕНОВАНИЕ get_thread_area, set_thread_area \- управляют информацией области локального хранилища нити .SH БИБЛИОТЕКА Стандартная библиотека языка C (\fIlibc\fP, \fI\-lc\fP) .SH ОБЗОР .nf \fB#include \fP /* определения констант \fBSYS_*\fP */ \fB#include \fP .P \fB#if defined __i386__ || defined __x86_64__\fP \fB# include \fP /* определения \fBstruct user_desc\fP */ .P \fBint syscall(SYS_get_thread_area, struct user_desc *\fP\fIu_info\fP\fB);\fP \fBint syscall(SYS_set_thread_area, struct user_desc *\fP\fIu_info\fP\fB);\fP .P \fB#elif defined __m68k__\fP .P \fBint syscall(SYS_get_thread_area);\fP \fBint syscall(SYS_set_thread_area, unsigned long \fP\fItp\fP\fB);\fP .P \fB#elif defined __mips__ || defined __csky__\fP .P \fBint syscall(SYS_set_thread_area, unsigned long \fP\fIaddr\fP\fB);\fP .P \fB#endif\fP .fi .P \fIПримечание\fP: glibc не предоставляет обёрточных функций для этих системных вызовов, что делает необходимым использование \fBsyscall\fP(2). .SH ОПИСАНИЕ These calls provide architecture\-specific support for a thread\-local storage implementation. At the moment, \fBset_thread_area\fP() is available on m68k, MIPS, C\-SKY, and x86 (both 32\-bit and 64\-bit variants); \fBget_thread_area\fP() is available on m68k and x86. .P On m68k, MIPS and C\-SKY, \fBset_thread_area\fP() allows storing an arbitrary pointer (provided in the \fBtp\fP argument on m68k and in the \fBaddr\fP argument on MIPS and C\-SKY) in the kernel data structure associated with the calling thread; this pointer can later be retrieved using \fBget_thread_area\fP() (see also NOTES for information regarding obtaining the thread pointer on MIPS). .P На x86 в Linux под локальное хранилище нити отдано три элемента глобальной таблицы дескрипторов (GDT). Подробней о GDT читайте в Intel Software Developer's Manual или AMD Architecture Programming Manual. .P Этим системным вызовам передаётся указатель на структуру вида: .P .in +4n .EX struct user_desc { unsigned int entry_number; unsigned int base_addr; unsigned int limit; unsigned int seg_32bit:1; unsigned int contents:2; unsigned int read_exec_only:1; unsigned int limit_in_pages:1; unsigned int seg_not_present:1; unsigned int useable:1; #ifdef __x86_64__ unsigned int lm:1; #endif }; .EE .in .P Вызов \fBget_thread_area\fP() читает элемент GDT, указанный в \fIu_info\->entry_number\fP и заполняет оставшиеся поля в \fIu_info\fP. .P Вызов \fBset_thread_area\fP() изменяет элемент TLS в GDT. .P Элемент массива TLS, устанавливаемый \fBset_thread_area\fP(), соответствует значению \fIu_info\->entry_number\fP, которое передал пользователь. Если это значение находится в допустимых пределах, то \fBset_thread_area\fP() записывает дескриптор TLS, на который указывает \fIu_info\fP, в массив TLS нити. .P Когда \fBset_thread_area\fP() передаётся \fIentry_number\fP со значением \-1, то ищется свободный элемент TLS. Если \fBset_thread_area\fP() находит свободный элемент TLS, то значение \fIu_info\->entry_number\fP устанавливается после возврата для показа того, какой же элемент был изменён. .P Структура \fIuser_desc\fP считается «пустой», если \fIread_exec_only\fP и \fIseg_not_present\fP равны 1, а все остальные поля равны 0. Если «пустой» дескриптор передаётся в \fBset_thread_area\fP(), то соответствующий элемент TLS будет очищен. Дополнительную информацию смотрите в разделе ДЕФЕКТЫ. .P Начиная с Linux 3.19, \fBset_thread_area\fP() нельзя использовать для записи отсутствующих сегментов, 16\-битных сегментов или сегментов кода, но допускается очистка таких сегментов. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" On x86, these system calls return 0 on success, and \-1 on failure, with \fIerrno\fP set to indicate the error. .P On C\-SKY, MIPS and m68k, \fBset_thread_area\fP() always returns 0. On m68k, \fBget_thread_area\fP() returns the thread area pointer value (previously set via \fBset_thread_area\fP()). .SH ОШИБКИ .TP \fBEFAULT\fP \fIu_info\fP является некорректным указателем. .TP \fBEINVAL\fP \fIu_info\->entry_number\fP вне допустимых границ. .TP \fBENOSYS\fP Вызов \fBget_thread_area\fP() или \fBset_thread_area\fP() был вызван как 64\-битный системный вызов. .TP \fBESRCH\fP (\fBset_thread_area\fP()) Невозможно найти свободный элемент TLS. .SH СТАНДАРТЫ Linux. .SH ИСТОРИЯ .TP \fBset_thread_area\fP() Linux 2.5.29. .TP \fBget_thread_area\fP() Linux 2.5.32. .SH ПРИМЕЧАНИЯ These system calls are generally intended for use only by threading libraries. .P На x86 вызов \fBarch_prctl\fP(2) может влиять на \fBset_thread_area\fP(). Подробней смотрите в \fBarch_prctl\fP(2). Обычно это не вызывает проблем, так как \fBarch_prctl\fP(2) обычно используется только в 64\-битных программах. .P На MIPS текущее значение указателя области нити можно получить с помощью инструкции: .P .in +4n .EX rdhwr dest, $29 .EE .in .P Эта инструкция ловится и обрабатывается ядром. .SH ОШИБКИ .\" commit e30ab185c490e9a9381385529e0fd32f0a399495 В 64\-битных ядрах до Linux 3.19, если был установлен один из битов заполнения в \fIuser_desc\fP, то это приводило к тому, что дескриптор не считался пустым (смотрите \fBmodify_ldt\fP(2)). В результате, единственным надёжным способом очистить элемент TLS было задействование \fBmemset\fP(3) для обнуления всей структуры \fIuser_desc\fP, включая биты заполнения, и затем установка битов \fIread_exec_only\fP и \fIseg_not_present\fP. В Linux 3.19, структура \fIuser_desc\fP, полностью состоящая из нулей кроме \fIentry_number\fP, также будет считаться запросом на очистку элемента TLS, что отличается от работы старых ядер. .P До Linux 3.19, сегментные регистры DS и ES не должны ссылаться на элементы TLS. .SH "СМОТРИТЕ ТАКЖЕ" \fBarch_prctl\fP(2), \fBmodify_ldt\fP(2), \fBptrace\fP(2) (\fBPTRACE_GET_THREAD_AREA\fP and \fBPTRACE_SET_THREAD_AREA\fP) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства разработал(и) Alexander Golubev , Azamat Hackimov , Hotellook, Nikita , Spiros Georgaras , Vladislav , Yuri Kozlov , Иван Павлов и Kirill Rekhov . .PP Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, .UR https://www.gnu.org/licenses/gpl-3.0.html .UE версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. .PP Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу .MT списка рассылки русских переводчиков .ME .