zion - get_user
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
Résumé
#include <asm/uaccess.h> .nf 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
Poster un commentaire