Man page - modify_ldt(2)

Packages contains this manual

Available languages:

en fr ja ru ro

Manual

modify_ldt

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
STANDARDS
NOTES
BOGUES
VOIR AUSSI
TRADUCTION

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