set_thread_area(2) System Calls Manual set_thread_area(2) NOM get_thread_area, set_thread_area - Manipuler les informations de la zone de stockage locale du thread BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include /* Definition des constantes SYS_* */ #include #if defined __i386__ || defined __x86_64__ # include /* Definition 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 systeme, l'utilisation de syscall(2) est requise. DESCRIPTION Ces appels fournissent la prise en charge specifique a l'architecture de l'implementation 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 parametres tp sur m68k et addr sur MIPS et C-SKY) dans la structure de donnees du noyau associee au thread appelant ; ce pointeur peut etre recupere 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 entrees de la GDT (Table globale de descripteurs) au stockage local du thread. Pour plus d'informations sur la GDT, voir le manuel du developpeur logiciel d'Intel ou le manuel de programmation de l'architecture AMD. Les deux appels systeme 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'entree de la GDT indiquee par u_info->entry_number et remplit le reste des champs dans u_info. set_thread_area() definit une entree TLS (Memoire locale de thread) dans la GDT. L'entree de la table de stockage local du thread (TLS) definie par set_thread_area() correspond a la valeur u_info->entry_number fournie par l'utilisateur. Si la valeur est dans les limites, set_thread_area() copie le descripteur TLS pointe par u_info dans la table TLS du thread. Quand set_thread_area() recoit un nombre entry_number valant -1, il cherche une entree libre dans la table TLS. Si set_thread_area() trouve une entree TLS libre, la valeur de u_info->entry_number est remplie au retour pour montrer quelle entree a ete modifiee. Un user_desc est considere comme << vide >> si read_exec_only et seg_not_present sont positionnes sur 1 et tous les autres champs valent 0. Si un descripteur << vide >> est passe a set_thread_area(), l'entree TLS correspondante sera effacee. Voir BOGUES pour des details complementaires. Depuis Linux 3.19, set_thread_area() ne peut pas etre utilise pour ecrire des segments non presents, segments 16 bits ou de code, bien que le vidage d'un segment soit toujours acceptable. VALEUR RENVOYEE Sur x86, ces appels systeme renvoient 0 s'ils reussissent et -1 s'ils echouent 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 (precedemment definie a 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 ete appele en tant qu'appel systeme 64 bits. ESRCH (set_thread_area()) Impossible de trouver une entree TLS libre. STANDARDS Linux. HISTORIQUE set_thread_area() Linux 2.5.29. get_thread_area() Linux 2.5.32. NOTES Ces appels systeme ne sont generalement concus que pour une utilisation dans des bibliotheques de segmentation de processus. arch_prctl(2) peut interferer avec set_thread_area() sur x86. Voir arch_prctl(2) pour plus de details. Il ne s'agit pas d'un probleme en general, car arch_prctl(2) n'est en principe utilise que par des programmes 64 bits. Sur MIPS, la valeur actuelle du pointeur de la zone de thread peut etre recuperee 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 positionne, empecherait le descripteur d'etre considere comme vide (voir modify_ldt(2)). Il s'en suit que la seule maniere fiable d'effacer une entree TLS est d'utiliser memset(3) pour mettre a zero 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 entierement en zeros sauf entry_number sera aussi interprete comme une requete pour effacer une entree TLS, mais le comportement etait different sur les anciens noyaux. Avant Linux 3.19, les registres de segment DS et ES ne doivent pas se referer aux entrees TLS. VOIR AUSSI arch_prctl(2), modify_ldt(2), ptrace(2) (PTRACE_GET_THREAD_AREA et PTRACE_SET_THREAD_AREA) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 set_thread_area(2)