Scroll to navigation

arch_prctl(2) System Calls Manual arch_prctl(2)

NUME

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

BIBLIOTECA

Biblioteca C standard (libc, -lc)

REZUMAT

#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 code, unsigned long addr);
int syscall(SYS_arch_prctl, int code, 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. cod 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:

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).
Returnează valoarea fanionului manipulat de ARCH_SET_CPUID ca rezultat al apelului de sistem (1 pentru activat, 0 pentru dezactivat). Parametrul addr este ignorat.
Stabilește baza pe 64 de biți pentru registrul FS la addr.
Returnează valoarea de bază pe 64 de biți pentru registrul FS al firului apelant în unsigned long indicat de addr.
Stabilește baza pe 64 de biți pentru registrul GS la addr.
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

addr indică o adresă nealocată sau se află în afara spațiului de adrese al procesului.
code nu este o subcomandă validă.
A fost solicitat ARCH_SET_CPUID, dar hardware-ul subiacent nu acceptă erorile CPUID.
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 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.

30 martie 2023 Pagini de manual de Linux 6.05.01