plucky (2) modify_ldt.2.gz

Provided by: manpages-fr-dev_4.25.1-1_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

       Linux.

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