ИМЯ
arch_prctl − установить состояние треда, специфичное для архитектуры
ОБЗОР
#include <asm/prctl.h>
#include <sys/prctl.h>
int arch_prctl(int code, unsigned long addr)
ОПИСАНИЕ
Функция arch_prctl устанавливает специфичное для данной архитектуры состояние процесса или треда. Параметр code выбирает подфункцию и передаёт ей аргумент addr .
Подфункции
для 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 на который указывает параметр address .
ЗАМЕЧАНИЯ
arch_prctl поддерживается в настоящий момент только в Linux/x86-64 для 64битных программ.
64биная база изменяется, когда загружается новый 32битный селектор сегмента.
ARCH_SET_GS запрещается в некоторых ядрах.
Переключение контекста для 64битных баз сегментов является более экономичным. Использование селектора сегмента, устанавливаемого через один из LDT с помощью modify_ldt(2) или с помощью системного вызова set_thread_area(2) в ядре 2.5, может быть более быстрой альтернативой для установки 32биной базы. Вызов arch_prctl нужен только, когда вы хотите установить базы, которые больше чем 4GB. Память в первых 2GB адресного пространтсва может быть выделена с помощью mmap(2) при использоавании флага MAP_32BIT .
Прототипов для arch_prctl в glibc 2.2 не существуюет. Вы должны объявлять эту функцию сами. Это будет исправлено в будущих версиях glibc.
Регистр FS может быть уже использован библиотекой тредов.
ОШИБКИ
EINVAL |
code не является допустимым кодом подфункции. | ||
EPERM |
addr находится за пределами адресного пространтсва. | ||
EFAULT |
addr указывает на невыделенный адрес или за пределы адресного пространства процесса. |
АВТОР
Страницу руководства написал Andi Kleen.
СООТВЕТСТВИЕ СТАНДАРТАМ
Вызов arch_prctl является расширением для Linux/x86-64 и не должен использоваться в программах, которые задумываются как переносимые.
СМОТРИ ТАКЖЕ
mmap(2), modify_ldt(2), prctl(2), set_thread_area(2)
Руководство программиста AMD X86-64
ПЕРЕВОД
Перевёл с английского Виктор Вислобоков <corochoone [AT] perm.ru> 2003