arch_prctl(2)

NUME
arch_prctl - stabilește starea firului de execuție specifică arhitecturii

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <asm/prctl.h>        /* Definiția constantelor ARCH_* */
#include <sys/syscall.h>      /* Definiția constantelor SYS_* */
#include <unistd.h>

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

Notă: glibc nu oferă nici o funcție de învăluire pentru arch_prctl(), fiind necesară utilizarea syscall(2).

DESCRIERE
arch_prctl() stabilește starea procesului sau a firului de execuție specifică arhitecturii. op selectează o subfuncție și îi transmite argumentul addr; addr este interpretat fie ca un unsigned long pentru operațiile de „set” (stabilire), fie ca un unsigned long *, pentru operațiile de „get” (obținere).

Subfuncțiile atât pentru x86 cât și pentru x86-64 sunt:

ARCH_SET_CPUID (începând cu Linux 4.12)
    Activează (addr != 0) sau dezactivează (addr == 0) instrucțiunea cpuid pentru firul apelant. Instrucțiunea este activată în mod implicit. Dacă este dezactivată, orice execuție a unei instrucțiuni cpuid va genera în schimb un semnal SIGSEGV. Această caracteristică poate fi utilizată pentru a emula rezultatele cpuid care diferă de ceea ce ar fi produs hardware-ul subiacent (de exemplu, într-un mediu de paravirtualizare).

    Valoarea parametrului ARCH_SET_CPUID este păstrată în fork(2) și clone(2), dar este restabilită la valoarea implicită (adică cpuid activat) în execve(2).

ARCH_GET_CPUID (începând cu Linux 4.12)
    Returnează valoarea fanionului manipulat de ARCH_SET_CPUID ca rezultat al apelului de sistem (1 pentru activat, 0 pentru dezactivat). Parametrul addr este ignorat.

Subfuncțiile numai pentru x86-64 sunt:

ARCH_SET_FS
    Stabilește baza pe 64 de biți pentru registrul FS la addr.

ARCH_GET_FS
    Returnează valoarea de bază pe 64 de biți pentru registrul FS al firului apelant în unsigned long indicat de addr.

ARCH_SET_GS
    Stabilește baza pe 64 de biți pentru registrul GS la addr.

ARCH_GET_GS
    Returnează valoarea de bază pe 64 de biți pentru registrul GS al firului apelant în unsigned long indicat de addr.

VALOAREA RETURNATĂ
În caz de succes, arch_prctl() returnează 0; în caz de eroare, se returnează -1, iar errno este configurată pentru a indica eroarea.

ERORI-IEȘIRE

EFAULT
    addr indică o adresă nealocată sau se află în afara spațiului de adrese al procesului.

EINVAL
    op nu este o subcomandă validă.

ENODEV
    A fost solicitat ARCH_SET_CPUID, dar hardware-ul subiacent nu acceptă erorile CPUID.

EPERM
    addr se află în afara spațiului de adrese al procesului.

STANDARDE
Linux/x86-64.

NOTE
arch_prctl() este acceptat numai pe Linux/x86-64 pentru programele pe 64 de biți în prezent.

Baza pe 64 de biți se modifică atunci când se încarcă un nou selector de segmente pe 32 de biți.

ARCH_SET_GS este dezactivat în unele nuclee.

Comutările de context pentru bazele de segmente pe 64 de biți sunt destul de costisitoare. Ca o optimizare, dacă se utilizează o adresă de bază TLS pe 32 de biți, arch_prctl() poate utiliza o intrare TLS reală ca și cum ar fi fost apelat set_thread_area(2), în loc să manipuleze direct registrul bazei segmentului. Memoria din primii 2 Go de spațiu de adresare poate fi alocată prin utilizarea mmap(2) cu fanionul MAP_32BIT.

Din cauza optimizării menționate mai sus, utilizarea arch_prctl() și set_thread_area(2) în același fir de execuție este periculoasă, deoarece acestea pot suprascrie intrările TLS ale celuilalt.

Este posibil ca FS să fie deja utilizat de biblioteca de fire de execuție. Programele care utilizează direct ARCH_SET_FS sunt foarte susceptibile de a se bloca.

CONSULTAȚI ȘI
mmap(2), modify_ldt(2), prctl(2), set_thread_area(2)

AMD X86-64 Programmer's manual

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.