ИМЯ¶
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@perm.ru> 2003