Provided by: manpages-fr-dev_4.15.0-9_all bug

NOM

       modify_ldt - Lire/écrire une entrée de LDT par processus

SYNOPSIS

       #include <asm/ldt.h>         /* Definition of struct user_desc */
       #include <sys/syscall.h>     /* Definition of SYS_* constants */
       #include <unistd.h>

       int syscall(SYS_modify_ldt, int func, void *ptr,
                   unsigned long bytecount);

       Note: glibc provides no wrapper for modify_ldt(), necessitating the use of syscall(2).

DESCRIPTION

       modify_ldt() lit ou écrit 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 référer 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
       développeur d'Intel ou le manuel de programmation de l'architecture AMD.

       Quand  func  vaut  0, modify_ldt() lit la LDT dans la mémoire 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 était complétée par des octets zéro supplémentaires.
       En cas de succès, modify_ldt() renverra le nombre d'octets lus.

       Quand func vaut  1  ou  0x11,  modify_ldt()  modifie  l’entrée  de  la  LDT  indiquée  par
       ptr->entry_number. ptr pointe sur une structure user_desc et bytecount doit être égal à la
       taille de cette structure.

       La structure user_desc est déclarée dans <asm/ldt.h> 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 précédentes, cette structure s'appelait modify_ldt_ldt_s.

       Le champ contents est le type de segment (données, données allongées, code non conforme ou
       code  conforme).  Les  autres  champs  correspondent  à leur description dans le manuel du
       processeur, bien que modify_ldt() ne puisse pas positionner le bit « access »  défini  par
       le matériel et décrit dans le manuel du processeur.

       Une   structure   user_desc   est   considérée   comme   « empty »  si  read_exec_only  et
       seg_not_present sont positionnés sur 1 et tous les autres champs valent 0. Une  entrée  de
       LDT peut être effacée en la positionnant sur une structure user_desc « empty » ou, si func
       vaut 1, en positionnant à la fois base et limit sur 0.

       Un segment de code conforme (c'est-à-dire avec contents==3) sera rejeté si func vaut 1  ou
       si seg_not_present vaut 0.

       Quand func vaut 2, modify_ldt() lira des zéros. Cela semble être un reliquat de Linux 2.4.

VALEUR RENVOYÉE

       S'il  réussit  modify_ldt()  renvoie soit le nombre d'octets lus soit 0 (écriture). En cas
       d'échec -1 est renvoyé 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 égal à la taille de  la  structure
              user_desc,  ou  bien  func  vaut  1  ou  0x11 et la nouvelle entrée de la LDT a des
              valeurs illégales.

       ENOSYS func ne vaut ni 0, ni 1, ni 2, ni 0x11.

CONFORMITÉ

       Cet appel système est spécifique à Linux et ne doit pas être employé dans  des  programmes
       destinés à être portables.

NOTES

       modify_ldt()  ne  doit pas être utilisé pour une mémoire locale de thread, car il ralentit
       les changements de contexte et ne prend en charge qu'un  nombre  limité  de  threads.  Les
       bibliothèques   de  segmentation  de  processus  (threading))  devraient  plutôt  utiliser
       set_thread_area(2) ou arch_prctl(2), sauf sur des noyaux très anciens qui  ne  gèrent  pas
       ces appels système.

       L'utilisation  normale  de  modify_ldt() est d'exécuter du code 16 bits basique ou 32 bits
       segmenté. Cependant, tous les noyaux ne permettent  pas  à  des  segments  16 bits  d'être
       installés.

       Même  sur  les noyaux 64 bits, modify_ldt() ne peut pas être utilisé pour créer un segment
       de code en mode long (c'est-à-dire 64 bits). Le champ « lm » non documenté dans  user_desc
       n'est pas utile et, malgré son nom, n'aboutit pas à un segment en mode long.

BOGUES

       Sur  les  noyaux  64  bits  antérieurs  à Linux 3.19, le positionnement du bit « lm » dans
       user_desc empêche le descripteur d'être considéré comme vide. Garder en tête  que  le  bit
       « lm » n'existe pas dans les en-têtes 32 bits mais ces noyaux bogués verront encore ce bit
       même s'il est positionné dans un processus 32 bits.

VOIR AUSSI

       arch_prctl(2), set_thread_area(2), vm86(2)

COLOPHON

       Cette page fait partie de la publication 5.13 du projet man-pages Linux.  Une  description
       du  projet et des instructions pour signaler des anomalies et la dernière version de cette
       page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

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  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  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⟩.