SET_THREAD_AREA(2) | Руководство программиста Linux | SET_THREAD_AREA(2) |
ИМЯ¶
get_thread_area, set_thread_area - set a GDT entry for thread-local storage
СИНТАКСИС¶
#include <linux/unistd.h> #include <asm/ldt.h>
int get_thread_area(struct user_desc *u_info); int set_thread_area(struct user_desc *u_info);
Замечание: В glibc нет обёрточных функций для этих системных вызовов; смотрите ЗАМЕЧАНИЯ.
ОПИСАНИЕ¶
Linux dedicates three global descriptor table (GDT) entries for thread-local storage. For more information about the GDT, see the Intel Software Developer's Manual or the AMD Architecture Programming Manual.
Этим системным вызовам передаётся указатель на структуру вида:
struct user_desc {
unsigned int entry_number;
unsigned long 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; };
Вызов get_thread_area() читает элемент GDT, указанный в u_info->entry_number и заполняет оставшиеся поля в u_info.
Вызов set_thread_area() изменяет элемент TLS в GDT.
Элемент массива TLS, устанавливаемый set_thread_area(), соответствует значению u_info->entry_number, которое передал пользователь. Если это значение находится в допустимых пределах, то set_thread_area() записывает дескриптор TLS, на который указывает u_info, в массив TLS нити.
Когда set_thread_area() передаётся entry_number со значением -1, то ищется свободный элемент TLS. Если set_thread_area() находит свободный элемент TLS, то значение u_info->entry_number устанавливается после возврата для показа того, какой же элемент был изменён.
Структура user_desc считается «пустой», если read_exec_only и seg_not_present равны 1, а все остальные поля равны 0. Если «пустой» дескриптор передаётся в set_thread_area, то соответствующий элемент TLS будет очищен. Дополнительную информацию смотрите в разделе ДЕФЕКТЫ.
Начиная с Linux 3.19, set_thread_area() нельзя использовать для записи отсутствующих сегментов, 16-битных сегментов или сегментов кода, но допускается очистка таких сегментов.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
These system calls return 0 on success, and -1 on failure, with errno set appropriately.
ОШИБКИ¶
ВЕРСИИ¶
Вызов set_thread_area() появился в версии 2.5.29. Вызов get_thread_area() появился в Linux 2.5.32.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
set_thread_area() is Linux-specific and should not be used in programs that are intended to be portable.
ЗАМЕЧАНИЯ¶
В glibc нет обёрточных функций для этих системных вызовов, так как они предназначены только для использования в библиотеках нитей. Если вам всё-таки нужно их вызвать, используйте syscall(2).
arch_prctl(2) can interfere with set_thread_area(). See arch_prctl(2) for more details. This is not normally a problem, as arch_prctl(2) is normally used only by 64-bit programs.
ДЕФЕКТЫ¶
В 64-битных ядрах до Linux 3.19, если был установлен один из битов заполнения в user_desc, то это приводило к тому, что дескриптор не считался пустым (смотрите modify_ldt(2)). В результате, единственным надёжным способом очистить элемент TLS было задействование memset(3) для обнуления всей структуры user_desc, включая биты заполнения, и затем установка битов read_exec_only и seg_not_present. В Linux 3.19, структура user_desc, полностью состоящая из нулей кроме entry_number, также будет считаться запросом на очистку элемента TLS, что отличается от работы старых ядер.
До Linux 3.19, сегментные регистры DS и ES не должны ссылаться на элементы TLS.
СМ. ТАКЖЕ¶
ЗАМЕЧАНИЯ¶
Эта страница является частью проекта Linux man-pages версии 4.16. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.
ПЕРЕВОД¶
Русский перевод этой страницы руководства был сделан Alexander Golubev <fatzer2@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Hotellook, Nikita <zxcvbnm3230@mail.ru>, Spiros Georgaras <sng@hellug.gr>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
15 сентября 2017 г. | Linux |