Provided by: manpages-ru-dev_4.27.0-1_all bug

НАИМЕНОВАНИЕ

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

БИБЛИОТЕКА

       Стандартная библиотека языка C (libc, -lc)

ОБЗОР

       #include <asm/prctl.h>        /* определения констант ARCH_* */
       #include <sys/syscall.h>      /* определения констант SYS_* */
       #include <unistd.h>

       int syscall(SYS_arch_prctl, int op, unsigned long addr);
       int syscall(SYS_arch_prctl, int op, unsigned long *addr);

       Примечание: glibc не предоставляет оболочку для arch_prctl(), что требует использования syscall(2).

ОПИСАНИЕ

       arch_prctl()   sets  architecture-specific  process  or thread state.  op selects an operation and passes
       argument addr to it; addr is interpreted as either an unsigned long for the "set" operations,  or  as  an
       unsigned long *, for the "get" operations.

       Подфункции для x86 и x86-64:

       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.

       Подфункции только для x86-64:

       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 задаётся причина ошибки.

ОШИБКИ

       EFAULT В addr задан не выделенный адрес или вне адресного пространства процесса.

       EINVAL op - недопустимая операция.

       ENODEV ARCH_SET_CPUID был запрошен, но базовое оборудование не поддерживает сбой CPUID.

       EPERM  addr лежит вне адресного пространства процесса.

СТАНДАРТЫ

       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> и Kirill Rekhov <krekhov.dev@gmail.com>

       Этот  перевод является свободной программной документацией; он распространяется на условиях общедоступной
       лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html  версии  3  или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если  вы  обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
       разработчику(ам)  по  его(их)  адресу(ам)  электронной  почты  или  по   адресу   списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                   2 мая 2024 г.                                    arch_prctl(2)