modify_ldt(2) System Calls Manual modify_ldt(2) NOM modify_ldt - Lire/ecrire une entree de LDT par processus BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include /* Definition de struct user_desc */ #include /* Definition des constantes SYS_* */ #include int syscall(SYS_modify_ldt, int func, void ptr[.bytecount], unsigned long bytecount); Note : la glibc ne fournit pas d'enveloppe autour de modify_ldt(), necessitant l'utilisation de syscall(2). DESCRIPTION modify_ldt() lit ou ecrit la table des descripteurs locaux (Local Descriptor Table - Table Locale des Descripteurs) du processus. La LDT est une table de descripteurs de segments auxquels peut se referer le code utilisateur. Linux permet aux processus de configurer une LDT par processus (par mm). Pour plus d'informations sur la LDT, voir le manuel du developpeur d'Intel ou le manuel de programmation de l'architecture AMD. Quand func vaut 0, modify_ldt() lit la LDT dans la memoire vers laquelle pointe ptr. Le nombre d'octets lus est le minimum entre bytecount et la vraie taille de la LDT, bien que le noyau puisse agir comme si la LDT etait completee par des octets zero supplementaires. En cas de succes, modify_ldt() renverra le nombre d'octets lus. Quand func vaut 1 ou 0x11, modify_ldt() modifie l'entree de la LDT indiquee par ptr->entry_number. ptr pointe sur une structure user_desc et bytecount doit etre egal a la taille de cette structure. La structure user_desc est declaree dans comme suit : 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; }; Sous Linux 2.4 et les versions precedentes, cette structure s'appelait modify_ldt_ldt_s. Le champ contents est le type de segment (donnees, donnees allongees, code non conforme ou code conforme). Les autres champs correspondent a leur description dans le manuel du processeur, bien que modify_ldt() ne puisse pas positionner le bit << access >> defini par le materiel et decrit dans le manuel du processeur. Une structure user_desc est consideree comme << empty >> si read_exec_only et seg_not_present sont positionnes sur 1 et tous les autres champs valent 0. Une entree de LDT peut etre effacee en la positionnant sur une structure user_desc << empty >> ou, si func vaut 1, en positionnant a la fois base et limit sur 0. Un segment de code conforme (c'est-a-dire avec contents==3) sera rejete si func vaut 1 ou si seg_not_present vaut 0. Quand func vaut 2, modify_ldt() lira des zeros. Cela semble etre un reliquat de Linux 2.4. VALEUR RENVOYEE S'il reussit modify_ldt() renvoie soit le nombre d'octets lus soit 0 (ecriture). En cas d'echec -1 est renvoye et errno contient le code d'erreur. ERREURS EFAULT ptr pointe en dehors de l'espace d'adressage accessible. EINVAL ptr vaut 0 ou func vaut 1 et bytecount n'est pas egal a la taille de la structure user_desc, ou bien func vaut 1 ou 0x11 et la nouvelle entree de la LDT a des valeurs illegales. ENOSYS func ne vaut ni 0, ni 1, ni 2, ni 0x11. STANDARDS Linux. NOTES modify_ldt() ne doit pas etre utilise pour une memoire locale de thread, car il ralentit les changements de contexte et ne prend en charge qu'un nombre limite de threads. Les bibliotheques de segmentation de processus (threading)) devraient plutot utiliser set_thread_area(2) ou arch_prctl(2), sauf sur des noyaux tres anciens qui ne gerent pas ces appels systeme. L'utilisation normale de modify_ldt() est d'executer du code 16 bits basique ou 32 bits segmente. Cependant, tous les noyaux ne permettent pas a des segments 16 bits d'etre installes. Meme sur les noyaux 64 bits, modify_ldt() ne peut pas etre utilise pour creer un segment de code en mode long (c'est-a-dire 64 bits). Le champ << lm >> non documente dans user_desc n'est pas utile et, malgre son nom, n'aboutit pas a un segment en mode long. BOGUES Sur les noyaux 64 bits anterieurs a Linux 3.19, le positionnement du bit << lm >> dans user_desc empeche le descripteur d'etre considere comme vide. Garder en tete que le bit << lm >> n'existe pas dans les en-tetes 32 bits mais ces noyaux bogues verront encore ce bit meme s'il est positionne dans un processus 32 bits. VOIR AUSSI arch_prctl(2), set_thread_area(2), vm86(2) 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 modify_ldt(2)