arch_prctl
Section: System Calls (2)
Updated: 30 octobre 2022
Index
Return to Main Contents
NOM
arch_prctl - Définir l'état spécifique à l'architecture d’un processus
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#include <asm/prctl.h> /* Définition des constantes
ARCH_* */
#include <sys/syscall.h> /* Définition des constantes
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 : la glibc ne fournit pas d'enveloppe autour de arch_prctl(),
nécessitant l'utilisation de syscall(2).
DESCRIPTION
La fonction arch_prctl() définit l'état spécifique à l'architecture pour
le thread ou le processus. code sélectionne une sous-fonction et lui
passe l'argument addr ; addr est interprété comme un unsigned long
pour les opérations « set », ou comme un unsigned long *, pour les
opérations « get ».
Les sous-fonctions pour les architectures x86 et x86-64 sont :
- ARCH_SET_CPUID (depuis Linux 4.12)
-
Activer (addr != 0) ou désactiver (addr == 0) l'instruction cpuid
pour le thread appelant. L'instruction est activée par défaut. Si elle est
désactivée, l'exécution de l'instruction cpuid générera un signal
SIGSEGV. Cette fonctionnalité peut être utilisée pour émuler des
résultats de cpuid qui diffèrent de ceux obtenus normalement sur le
matériel sous-jacent (par exemple dans un environnement de
paravirtualisation).
-
Le paramètre ARCH_SET_CPUID est préservé pendant un fork(2) et un
clone(2) mais il est réinitialisé à l'état par défaut (donc cpuid
activé) en cas de execve(2).
- ARCH_GET_CPUID (depuis Linux 4.12)
-
Renvoyer la position de l'attribut manipulé par ARCH_SET_CPUID sous forme
d'un appel système (1 pour activé, 0 pour désactivé). addr est
ignoré.
- Les sous-fonctions pour l'architecture x86-64 sont :
-
- ARCH_SET_FS
-
Remplir la base 64 bits pour le registre FS avec addr.
- ARCH_GET_FS
-
Renvoyer la valeur dans la base 64 bits pour le registre FS du thread
appelant dans la variable unsigned long pointée par addr.
- ARCH_SET_GS
-
Remplir la base 64 bits pour le registre GS avec addr.
- ARCH_GET_GS
-
Renvoyer la valeur dans la base 64 bits pour le registre GS du thread
appelant dans la variable unsigned long pointée par addr.
VALEUR RENVOYÉE
S'il réussit, arch_prctl() renvoie 0. En cas d'erreur, il renvoie
-1 et remplit errno avec la valeur d'erreur.
ERREURS
- EFAULT
-
addr pointe vers une adresse non affectée ou est en dehors de l'espace
d'adressage.
- EINVAL
-
code n'est pas une sous-commande autorisée.
- ENODEV
-
ARCH_SET_CPUID a été sollicité mais le matériel ne prend pas en charge
les erreurs CPUID.
- EPERM
-
addr pointe en dehors de l'espace d'adressage du processus.
STANDARDS
arch_prctl() est une extension Linux/x86-64 et ne doit pas être employée
dans un programme portable.
NOTES
arch_prctl() n'est pris en charge sur Linux/x86-64 que pour les
programmes 64 bits.
La base 64 bits change lorsqu'un nouveau sélecteur de segment 32 bits est
chargé.
ARCH_SET_GS est inactif dans certains noyaux.
Les changements de contexte pour les bases 64 bits sont assez coûteux. Pour
les optimiser, si une adresse de base 32 bits TLS est utilisée,
arch_prctl() peut utiliser une entrée TLS réelle comme si on avait appelé
set_thread_area(2) plutôt que de manipuler directement le registre de la
base du segment. La mémoire dans les premiers 2 Go d'adressage peut être
allouée en utilisant mmap(2) avec l'attribut MAP_32BIT.
Du fait de l'optimisation précitée, l'utilisation de arch_prctl() et de
set_thread_area(2) dans le même thread est dangereuse car elles peuvent
écraser les entrées TLS entre elles.
FS peut être déjà utilisé par la bibliothèque de threading. Les
programmes qui utilisent directement ARCH_SET_FS vont très probablement
planter.
VOIR AUSSI
mmap(2), modify_ldt(2), prctl(2), set_thread_area(2)
Manuel du programmeur AMD X86-64
TRADUCTION
La traduction française de cette page de manuel a été créée par
Christophe Blaess <https://www.blaess.fr/christophe/>,
Stéphan Rafin <stephan.rafin@laposte.net>,
Thierry Vignaud <tvignaud@mandriva.com>,
François Micaux,
Alain Portal <aportal@univ-montp2.fr>,
Jean-Philippe Guérard <fevrier@tigreraye.org>,
Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>,
Julien Cristau <jcristau@debian.org>,
Thomas Huriaux <thomas.huriaux@gmail.com>,
Nicolas François <nicolas.francois@centraliens.net>,
Florentin Duneau <fduneau@gmail.com>,
Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
Denis Barbier <barbier@debian.org>,
David Prévot <david@tilapin.org>
et
Jean-Philippe MENGUAL <jpmengual@debian.org>
Cette traduction est une documentation libre ; veuillez vous reporter à la
GNU General Public License version 3
concernant les conditions de copie et
de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- STANDARDS
-
- NOTES
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 04:42:40 GMT, May 18, 2024