arch_prctl - настроить состояние нити (зависит от архитектуры)
arch_prctl(2)
настроить состояние нити (зависит от архитектуры)
ОБЗОР
#include <asm/prctl.h>
#include <sys/prctl.h>
int arch_prctl(int code, unsigned long addr);
int arch_prctl(int code, unsigned long *addr);
ОПИСАНИЕ
Функция
arch_prctl() задаёт состояние процесса или нити, зависящие от
архитектуры. В аргументе
code выбирается подфункция и ей передаётся
значение
addr; параметр
addr рассматривается либо как
unsigned long
при операциях «установки», либо как
unsigned long * при операциях
«получения» значения.
Подфункции для x86-64:
ARCH_SET_FS
Установить 64-битную базу для регистра FS равной addr.
ARCH_GET_FS
Вернуть значение 64-битной базы для регистра FS текущей нити в ячейку
длинной unsigned long, заданную адресом addr.
ARCH_SET_GS
Установить 64-битную базу для регистра GS равной addr.
ARCH_GET_GS
Вернуть значение 64-битной базы для регистра GS текущей нити в ячейку
длинной unsigned long, заданную адресом addr.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении
arch_prctl() возвращает 0; при ошибке --- -1, а
в
errno задаётся причина ошибки.
ОШИБКИ
EFAULT
В addr задан не выделенный адрес или вне адресного пространства процесса.
EINVAL
code не является допустимой подкомандой.
EPERM
addr лежит вне адресного пространства процесса.
СООТВЕТСТВИЕ СТАНДАРТАМ
arch_prctl() является расширением Linux/x86-64 и не должна использоваться
в переносимых программах.
ЗАМЕЧАНИЯ
В настоящее время
arch_prctl() поддерживается только на Linux/x86-64 для
64-битных программ.
64-битная база изменяется при загрузке нового 32-битного сегментного
селектора.
ARCH_SET_GS выключена в некоторых ядрах.
Переключение контекстов для 64-битных сегментных баз — довольно затратная
операция. В качестве оптимизации, если используется 32-битные базовые адреса
TLS, arch_prctl(2) может использовать реальную запись TLS, как при вызове
set_thread_area(2), а не изменять сегментный базовый регистр
напрямую. Память в первых 2ГБ адресного пространства может быть выделена
через mmap(2) с флагом MAP_32BIT.
Из-за вышеупомянутой оптимизации, использование arch_prctl(2) и
set_thread_area(2) в той же нити опасно, так как они могут перезаписать
TLS-записи друг друга.
В glibc версии 2.7 нет прототипа для arch_prctl(). Вам нужно объявлять
его самостоятельно. Это может быть исправлено в новых версиях glibc.
FS уже может использоваться библиотекой нитей. Программы, в которых
используется ARCH_SET_FS напрямую, весьма вероятно завершаться с ошибкой.