Provided by: manpages-fr-dev_4.13-4_all bug

NOM

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

SYNOPSIS

       #include <sys/types.h>

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

       Note : il n'existe pas d'enveloppe pour cet appel système dans la glibc ; voir NOTES.

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

       La glibc ne fournit pas de fonction autour de cet appel système ; appelez-le avec syscall(2).

       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.10 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 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.

Linux                                            9 février 2020                                    MODIFY_LDT(2)