table of contents
- bookworm-backports 4.24.0-2~bpo12+1
arch_prctl(2) | System Calls Manual | arch_prctl(2) |
ИМЯ¶
arch_prctl - настроить состояние нити (зависит от архитектуры)
БИБЛИОТЕКА¶
Стандартная библиотека языка C (libc, -lc)
СИНТАКСИС¶
#include <asm/prctl.h> /* определения констант ARCH_* */ #include <sys/syscall.h> /* определения констант SYS_* */ #include <unistd.h>
int syscall(SYS_arch_prctl, int code, unsigned long addr); int syscall(SYS_arch_prctl, int code, unsigned long *addr);
Note: glibc provides no wrapper for arch_prctl(), necessitating the use of syscall(2).
ОПИСАНИЕ¶
Вызов arch_prctl() задаёт состояние процесса или нити, зависящие от архитектуры. В аргументе code задаётся подфункция и ей передаётся значение addr; параметр addr рассматривается либо как unsigned long при операциях «установки» (set), либо как unsigned long * при операциях «получения» (get).
Subfunctions for both x86 and x86-64 are:
- ARCH_SET_CPUID (начиная с Linux 4.12)
- Enable (addr != 0) or disable (addr == 0) the cpuid instruction for the calling thread. The instruction is enabled by default. If disabled, any execution of a cpuid instruction will instead generate a SIGSEGV signal. This feature can be used to emulate cpuid results that differ from what the underlying hardware would have produced (e.g., in a paravirtualization setting).
- The ARCH_SET_CPUID setting is preserved across fork(2) and clone(2) but reset to the default (i.e., cpuid enabled) on execve(2).
- ARCH_GET_CPUID (начиная с Linux 4.12)
- Return the setting of the flag manipulated by ARCH_SET_CPUID as the result of the system call (1 for enabled, 0 for disabled). addr is ignored.
- Subfunctions for x86-64 only are:
- ARCH_SET_FS
- Установить 64-битную базу для регистра FS равной addr.
- ARCH_GET_FS
- Return the 64-bit base value for the FS register of the calling thread in the unsigned long pointed to by addr.
- ARCH_SET_GS
- Установить 64-битную базу для регистра GS равной addr.
- ARCH_GET_GS
- Return the 64-bit base value for the GS register of the calling thread in the unsigned long pointed to by addr.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
При успешном выполнении arch_prctl() возвращает 0; при ошибке — -1, а в errno задаётся причина ошибки.
ОШИБКИ¶
СТАНДАРТЫ¶
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-записи друг друга.
FS уже может использоваться библиотекой нитей. Программы, в которых используется ARCH_SET_FS напрямую, весьма вероятно завершаться с ошибкой.
СМОТРИТЕ ТАКЖЕ¶
mmap(2), modify_ldt(2), prctl(2), set_thread_area(2)
Руководство программиста для AMD X86-64
ПЕРЕВОД¶
Русский перевод этой страницы руководства разработал(и) Dmitry Bolkhovskikh <d20052005@yandex.ru> и Yuri Kozlov <yuray@komyakino.ru>
Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков.
30 октября 2022 г. | Справочные страницы Linux 6.03 |