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 <[email protected]>, Thierry Vignaud <[email protected]>, François Micaux, Alain Portal <[email protected]>, Jean-Philippe Guérard <[email protected]>, Jean-Luc Coulon (f5ibh) <[email protected]>, Julien Cristau <[email protected]>, Thomas Huriaux <[email protected]>, Nicolas François <[email protected]>, Florentin Duneau <[email protected]>, Simon Paillard <[email protected]>, Denis Barbier <[email protected]>, David Prévot <[email protected]> et Jean-Philippe MENGUAL <[email protected]>
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 à [email protected]

Recommended readings

Pages related to modify_ldt you should read also: