arch_prctl - Définir l'état spécifique à
l'architecture d’un processus
Bibliothèque C standard (
libc,
-lc)
#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).
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.
S'il réussit,
arch_prctl() renvoie
0. En cas d'erreur, il
renvoie
-1 et remplit
errno avec la valeur d'erreur.
- 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.
arch_prctl() est une extension Linux/x86-64 et ne doit pas être
employée dans un programme portable.
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.
mmap(2),
modify_ldt(2),
prctl(2),
set_thread_area(2)
Manuel du programmeur AMD X86-64
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Jean-Philippe MENGUAL <
[email protected]>
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 à
[email protected]