Man page - get_thread_area(2)

Packages contains this manual

Available languages:

en fr ja ru ro

Manual

set_thread_area

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
STANDARDS
HISTORIQUE
NOTES
BOGUES
VOIR AUSSI
TRADUCTION

NOM

get_thread_area, set_thread_area - Manipuler les informations de la zone de stockage locale du thread

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <sys/syscall.h> /* Définition des constantes SYS_* */
#include <unistd.h>

#if defined __i386__ || defined __x86_64__
# include <asm/ldt.h>
/* Définition de struct user_desc */

int syscall(SYS_get_thread_area, struct user_desc * u_info );
int syscall(SYS_set_thread_area, struct user_desc *
u_info );

#elif defined __m68k__

int syscall(SYS_get_thread_area);
int syscall(SYS_set_thread_area, unsigned long
tp );

#elif defined __mips__ || defined __csky__

int syscall(SYS_set_thread_area, unsigned long addr );

#endif

Note : la glibc ne fournit pas de fonction autour de cet appel systùme, l’utilisation de syscall (2) est requise.

DESCRIPTION

Ces appels fournissent la prise en charge spĂ©cifique Ă  l’architecture de l’implĂ©mentation d’un stockage local du thread. Pour le moment, set_thread_area () est disponible sur m68k, MIPS, C-SKY et x86 (variantes 32 et 64 bits) ; get_thread_area () est disponible sur m68k et x86.

Sur m68k, MIPS et C-SKY, set_thread_area () permet de stocker un pointeur arbitraire (fourni dans les paramĂštres tp sur m68k et addr sur MIPS et C-SKY) dans la structure de donnĂ©es du noyau associĂ©e au thread appelant ; ce pointeur peut ĂȘtre rĂ©cupĂ©rĂ© ensuite en utilisant get_thread_area () (voir aussi les NOTES pour des informations sur l’obtention du pointeur du thread sur MIPS).

Sur x86, Linux consacre trois entrĂ©es de la GDT (Table globale de descripteurs) au stockage local du thread. Pour plus d’informations sur la GDT, voir le manuel du dĂ©veloppeur logiciel d’Intel ou le manuel de programmation de l’architecture AMD.

Les deux appels systÚme prennent un argument qui est un pointeur vers une structure du type suivant :

struct user_desc {
unsigned int entry_number;
unsigned int base_addr;
unsigned int limit;
unsigned int seg_32bit:1;
unsigned int contents:2;
unsigned int read_exec_only:1;
unsigned int limit_in_pages:1;
unsigned int seg_not_present:1;
unsigned int useable:1;
#ifdef __x86_64__
unsigned int lm:1;
#endif
};

get_thread_area () lit l’entrĂ©e de la GDT indiquĂ©e par u_info->entry_number et remplit le reste des champs dans u_info .

set_thread_area () définit une entrée TLS (Mémoire locale de thread) dans la GDT.

L’entrĂ©e de la table de stockage local du thread (TLS) dĂ©finie par set_thread_area () correspond Ă  la valeur u_info->entry_number fournie par l’utilisateur. Si la valeur est dans les limites, set_thread_area () copie le descripteur TLS pointĂ© par u_info dans la table TLS du thread.

Quand set_thread_area () reçoit un nombre entry_number valant -1 , il cherche une entrée libre dans la table TLS. Si set_thread_area () trouve une entrée TLS libre, la valeur de u_info->entry_number est remplie au retour pour montrer quelle entrée a été modifiée.

Un user_desc est considĂ©rĂ© comme « vide » si read_exec_only et seg_not_present sont positionnĂ©s sur 1 et tous les autres champs valent 0 . Si un descripteur « vide » est passĂ© Ă  set_thread_area (), l’entrĂ©e TLS correspondante sera effacĂ©e. Voir BOGUES pour des dĂ©tails complĂ©mentaires.

Depuis Linux 3.19, set_thread_area () ne peut pas ĂȘtre utilisĂ© pour Ă©crire des segments non prĂ©sents, segments 16 bits ou de code, bien que le vidage d’un segment soit toujours acceptable.

VALEUR RENVOYÉE

Sur x86, ces appels systĂšme renvoient 0 s’ils rĂ©ussissent et -1 s’ils Ă©chouent en positionnant errno pour indiquer l’erreur.

Sur C-SKY, MIPS et m68k, set_thread_area () renvoie toujours 0 . Sur m68k, get_thread_area () renvoie la valeur du pointeur de la zone de thread (prĂ©cĂ©demment dĂ©finie Ă  l’aide de set_thread_area ()).

ERREURS

EFAULT

u_info est un pointeur non valable.

EINVAL

u_info->entry_number est en dehors des limites.

ENOSYS

get_thread_area () ou set_thread_area () a Ă©tĂ© appelĂ© en tant qu’appel systĂšme 64 bits.

ESRCH

( set_thread_area ()) Impossible de trouver une entrée TLS libre.

STANDARDS

Linux.

HISTORIQUE

set_thread_area ()

Linux 2.5.29.

get_thread_area ()

Linux 2.5.32.

NOTES

Ces appels systÚme ne sont généralement conçus que pour une utilisation dans des bibliothÚques de segmentation de processus.

arch_prctl (2) peut interfĂ©rer avec set_thread_area () sur x86. Voir arch_prctl (2) pour plus de dĂ©tails. Il ne s’agit pas d’un problĂšme en gĂ©nĂ©ral, car arch_prctl (2) n’est en principe utilisĂ© que par des programmes 64 bits.

Sur MIPS, la valeur actuelle du pointeur de la zone de thread peut ĂȘtre rĂ©cupĂ©rĂ©e en utilisant l’instruction :

rdhwr dest, $29

Cette instruction intercepte et est prise en charge par le noyau.

BOGUES

Sur des noyaux 64 bits avant Linux 3.19, un des bits de remplissage de user_desc , s’il est positionnĂ©, empĂȘcherait le descripteur d’ĂȘtre considĂ©rĂ© comme vide (voir modify_ldt (2)). Il s’en suit que la seule maniĂšre fiable d’effacer une entrĂ©e TLS est d’utiliser memset (3) pour mettre Ă  zĂ©ro toute la structure user_desc , y compris les bits de remplissage, puis de positionner les bits read_exec_only et seg_not_present . Sur Linux 3.19, un user_desc consistant entiĂšrement en zĂ©ros sauf entry_number sera aussi interprĂ©tĂ© comme une requĂȘte pour effacer une entrĂ©e TLS, mais le comportement Ă©tait diffĂ©rent sur les anciens noyaux.

Avant Linux 3.19, les registres de segment DS et ES ne doivent pas se référer aux entrées TLS.

VOIR AUSSI

arch_prctl (2), modify_ldt (2), ptrace (2) ( PTRACE_GET_THREAD_AREA et PTRACE_SET_THREAD_AREA )

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 à debian-l10n-french@lists.debian.org .