table of contents
ARCH_PRCTL(2) | Руководство программиста Linux | ARCH_PRCTL(2) |
ИМЯ¶
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 при операциях "установки", либо как 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 задаётся причина ошибки.
ОШИБКИ¶
СООТВЕТСТВИЕ СТАНДАРТАМ¶
arch_prctl() является расширением Linux/x86-64 и не должна использоваться в переносимых программах.
ЗАМЕЧАНИЯ¶
В настоящее время arch_prctl() поддерживается только на Linux/x86-64 для 64-битных программ.
64-битная база изменяется при загрузке нового 32-битного сегментного селектора.
ARCH_SET_GS выключена в некоторых ядрах.
Переключение контекстов для 64-битных сегментных баз — довольно затратная операция. Может оказаться быстрее задать 32-битную базу с помощью сегментного селектора, настроив LDT с помощью modify_ldt(2) или используя системный вызов set_thread_area(2), появившийся в kernel 2.5 или новее. arch_prctl() нужна только когда вы хотите задать базы, которые более 4ГБ. Память в первых 2ГБ адресного пространства может быть выделена через mmap(2) с флагом MAP_32BIT.
В glibc версии 2.7 нет прототипа для arch_prctl(). Вам нужно объявлять его самостоятельно. Это может быть исправлено в новых версиях glibc.
FS уже может использоваться библиотекой нитей.
СМОТРИТЕ ТАКЖЕ¶
mmap(2), modify_ldt(2), prctl(2), set_thread_area(2)
Руководство программиста для AMD X86-64
2007-12-26 | Linux |