Linux repositories inspector
Linux
2017-09-15

man-pages-ru

Russian man pages from the Linux Documentation Project

manpages-dev

Manual pages about using GNU/Linux for development

man-pages

Linux kernel and C library user-space interface documentation

ИМЯ

arch_prctl - настроить состояние нити (зависит от архитектуры)

ОБЗОР

#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 при операциях «установки» (set), либо как unsigned long * при операциях «получения» (get).
Подфункции для 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-битных сегментных баз — довольно затратная операция. В качестве оптимизации, если используется 3-битные базовые адреса TLS, arch_prctl() может использовать реальную запись TLS, как при вызове set_thread_area(2), а не изменять сегментный базовый регистр напрямую. Память в первых 2 ГБ адресного пространства может быть выделена через mmap(2) с флагом MAP_32BIT.
Из-за вышеупомянутой оптимизации, использование arch_prctl() и set_thread_area(2) в той же нити опасно, так как они могут перезаписать TLS-записи друг друга.
В glibc версии 2.7 нет прототипа для arch_prctl(). Вам нужно объявлять его самостоятельно. Это может быть исправлено в новых версиях glibc.
FS уже может использоваться библиотекой нитей. Программы, в которых используется ARCH_SET_FS напрямую, весьма вероятно завершаться с ошибкой.

СМОТРИТЕ ТАКЖЕ

mmap(2), modify_ldt(2), prctl(2), set_thread_area(2)
Руководство программиста для AMD X86-64
⇧ Top