table of contents
GET_USER(9) | Fonctions du noyau Linux | GET_USER(9) |
NOM¶
get_user, put_user, copy_from_user, copy_to_user - Copie des données entre l'espace mémoire du noyau et la mémoire utilisateur
SYNOPSIS¶
#include <asm/uaccess.h>
err = get_user ( x, addr ); err = put_user ( x, addr ); bytes_left = copy_from_user(void*to, const void *from, unsigned long n ); bytes_left = copy_to_user(void*to, const void *from, unsigned long n );
DESCRIPTION¶
Ces macros transfèrent des données entre les espaces mémoire du noyau et des processus (mémoire utilisateur). Dans le premier exemple, la variable du noyau x reçoit la valeur de ce qui à l'adresse addr (dans la mémoire utilisateur). put_user écrit la valeur de la variable x à l'adressse addr. NN : x est une variable, et non un pointeur ! addr doit absolument être un pointeur correctement typé car ce type détermine le nombre d'octets à copier.
copy_from_user copie n octets depuis l'adresse from dans l'espace mémoire utilisateur à l'adresse to dans l'espace mémoire du noyau. copy_to_user copie dans l'autre sens.
Aucune de ces macros ne nécessite l'antique appel
verify_area(), car toutes les vérifications sont
assurées par l'unité de pagination du microprocesseur. [
NdT : dans la version 2.1.2 les changements suivant ont
été opérés :
x = get_user(addr) => err = get_user(x,addr);
put_user(x,addr) => err = put_user(x,addr);
memcpy_fromfs(...) => bytes_left = copy_from_user(...);
memcpy_tofs(...) => bytes_left = copy_to_user(...);
Au lieu de vérifier à chaque transfert mémoire que les
zones cibles et destinations ont été correctement
alloués, Linus a décidé de supprimer tous ces tests.
Les accès incorrects sont gérés via le mécanisme
des exceptions : en cas d'erreur, le CPU passe la main au VM. Je ne
peux pas l'assurer, mais je crois que les autres architectures
supportées disposent d'un mécanisme analogue au mode
protégé des ix86. ]
Il y a ainsi moins de risque d'utiliser une adresse non valide. De plus, le
nouveau mécanisme est beaucoup plus rapide [Ndt : avec la
gestion des dentries apparues dans les 2.1.4x, c'est l'une des deux plus
importantes accélérations apportées au noyau].
VALEUR RENVOYÉE¶
get_user et put_user retournent 0 an cas de succès et -EFAULT en cas d'accès mémoire erroné. copy_from_user et copy_to_user retournent le nombre d'octets qui n'a pas pu être copié (de nouveau, 0 est une valeur de retour signifiant un succès).
EXEMPLES¶
if (get_user(type, (char *)arg)) return -EFAULT; switch (type) { ...
b.maxwidth = 768; b.maxheight = 576; b.minwidth = 32; b.minheight = 32; if(copy_to_user(arg, &b, sizeof(b))) return -EFAULT; return 0; ...
DISPONIBILITɶ
Linux 2.1.4+
VOIR AUSSI¶
verify_area(9)
AUTEUR¶
Page de manuel par Jim Van Zandt <jrv@vanzandt.mv.com>
TRADUCTION¶
Thierry Vignaud <tvignaud@mandrakesoft.com>, 1999
19 Mars 1999 | Linux |