Provided by: manpages-fr-dev_4.19.0-7_all bug

NOM

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

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #include <asm/ldt.h>         /* Définition de struct user_desc */
       #include <sys/syscall.h>     /* Definition des constantes SYS_* */
       #include <unistd.h>

       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(),  nécessitant
       l'utilisation de 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.

STANDARDS

       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)

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