.\" -*- coding: UTF-8 -*-
.\" Copyright (c) 1995 Michael Chastain (mec@duracef.shout.net), 22 July 1995.
.\" Copyright (c) 2015 Andrew Lutomirski
.\"
.\" %%%LICENSE_START(GPLv2+_DOC_FULL)
.\" This is free documentation; you can redistribute it and/or
.\" modify it under the terms of the GNU General Public License as
.\" published by the Free Software Foundation; either version 2 of
.\" the License, or (at your option) any later version.
.\"
.\" The GNU General Public License's references to "object code"
.\" and "executables" are to be interpreted as the output of any
.\" document formatting or typesetting system, including
.\" intermediate and printed output.
.\"
.\" This manual is distributed in the hope that it will be useful,
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
.\" GNU General Public License for more details.
.\"
.\" You should have received a copy of the GNU General Public
.\" License along with this manual; if not, see
.\" .
.\" %%%LICENSE_END
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH MODIFY_LDT 2 "9 février 2020" Linux "Manuel du programmeur Linux"
.SH NOM
modify_ldt \- Lire/écrire une entrée de LDT par processus
.SH SYNOPSIS
.nf
\fB#include \fP
.PP
\fBint modify_ldt(int \fP\fIfunc\fP\fB, void *\fP\fIptr\fP\fB, unsigned long \fP\fIbytecount\fP\fB);\fP
.fi
.PP
\fINote\fP\ : il n'existe pas d'enveloppe pour cet appel système dans la glibc\ ;
voir NOTES.
.SH DESCRIPTION
\fBmodify_ldt\fP() 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.
.PP
Quand \fIfunc\fP vaut \fB0\fP, \fBmodify_ldt\fP() lit la LDT dans la mémoire vers
laquelle pointe \fIptr\fP. Le nombre d'octets lus est le minimum entre
\fIbytecount\fP 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, \fBmodify_ldt\fP() renverra le nombre d'octets lus.
.PP
Quand \fIfunc\fP vaut \fB1\fP ou \fB0x11\fP, \fBmodify_ldt\fP() modifie l’entrée de la
LDT indiquée par \fIptr\->entry_number\fP. \fIptr\fP pointe sur une structure
\fIuser_desc\fP et \fIbytecount\fP doit être égal à la taille de cette structure.
.PP
La structure \fIuser_desc\fP est déclarée dans \fI\fP comme
suit\ :
.PP
.in +4n
.EX
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;
};
.EE
.in
.PP
Sous Linux 2.4 et les versions précédentes, cette structure s'appelait
\fImodify_ldt_ldt_s\fP.
.PP
Le champ \fIcontents\fP 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 \fBmodify_ldt\fP() ne puisse
pas positionner le bit «\ access\ » défini par le matériel et décrit dans le
manuel du processeur.
.PP
Une structure \fIuser_desc\fP est considérée comme «\ empty\ » si
\fIread_exec_only\fP et \fIseg_not_present\fP sont positionnés sur \fB1\fP et tous
les autres champs valent \fB0\fP. Une entrée de LDT peut être effacée en la
positionnant sur une structure \fIuser_desc\fP «\ empty\ » ou, si \fIfunc\fP vaut
\fB1\fP, en positionnant à la fois \fIbase\fP et \fIlimit\fP sur \fB0\fP.
.PP
Un segment de code conforme (c'est\-à\-dire avec \fIcontents==3\fP) sera rejeté
si \fIfunc\fP vaut \fB1\fP ou si \fIseg_not_present\fP vaut \fB0\fP.
.PP
Quand \fIfunc\fP vaut \fB2\fP, \fBmodify_ldt\fP() lira des zéros. Cela semble être un
reliquat de Linux 2.4.
.SH "VALEUR RENVOYÉE"
S'il réussit \fBmodify_ldt\fP() renvoie soit le nombre d'octets lus soit \fB0\fP
(écriture). En cas d'échec \fB\-1\fP est renvoyé et \fIerrno\fP contient le code
d'erreur.
.SH ERREURS
.TP
\fBEFAULT\fP
\fIptr\fP pointe en dehors de l'espace d'adressage accessible.
.TP
\fBEINVAL\fP
\fIptr\fP vaut \fB0\fP ou \fIfunc\fP vaut \fB1\fP et \fIbytecount\fP n'est pas égal à la
taille de la structure \fIuser_desc\fP, ou bien \fIfunc\fP vaut \fB1\fP ou \fB0x11\fP et
la nouvelle entrée de la LDT a des valeurs illégales.
.TP
\fBENOSYS\fP
\fIfunc\fP ne vaut ni \fB0\fP, ni \fB1\fP, ni \fB2\fP, ni \fB0x11\fP.
.SH CONFORMITÉ
Cet appel système est spécifique à Linux et ne doit pas être employé dans
des programmes destinés à être portables.
.SH NOTES
La glibc ne fournit pas de fonction autour de cet appel système\ ; appelez\-le
avec \fBsyscall\fP(2).
.PP
\fBmodify_ldt\fP() 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 \fBset_thread_area\fP(2) ou
\fBarch_prctl\fP(2), sauf sur des noyaux très anciens qui ne gèrent pas ces
appels système.
.PP
L'utilisation normale de \fBmodify_ldt\fP() 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.
.PP
Même sur les noyaux 64 bits, \fBmodify_ldt\fP() 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 \fIuser_desc\fP n'est pas utile et, malgré son nom,
n'aboutit pas à un segment en mode long.
.SH BOGUES
.\" commit e30ab185c490e9a9381385529e0fd32f0a399495
Sur les noyaux 64 bits antérieurs à Linux 3.19, le positionnement du bit
«\ lm\ » dans \fIuser_desc\fP 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.
.SH "VOIR AUSSI"
\fBarch_prctl\fP(2), \fBset_thread_area\fP(2), \fBvm86\fP(2)
.SH COLOPHON
Cette page fait partie de la publication\ 5.10 du projet \fIman\-pages\fP
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/.
.SH TRADUCTION
La traduction française de cette page de manuel a été créée par
Christophe Blaess ,
Stéphan Rafin ,
Thierry Vignaud ,
François Micaux,
Alain Portal ,
Jean-Philippe Guérard ,
Jean-Luc Coulon (f5ibh) ,
Julien Cristau ,
Thomas Huriaux ,
Nicolas François ,
Florentin Duneau ,
Simon Paillard ,
Denis Barbier ,
David Prévot
et
Jean-Philippe MENGUAL
.
Cette traduction est une documentation libre ; veuillez vous reporter à la
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License version 3
.UE
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 à
.MT
debian-l10n-french@lists.debian.org
.ME .