Linux |
CentOS 5.3 |
|
copy_to_user(9) |
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 |
#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 ); |
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 : |
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). |
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; | ||
... |
Linux 2.1.4+ |
verify_area(9) |
Page de manuel par Jim Van Zandt <jrv@vanzandt.mv.com> |
Thierry Vignaud <tvignaud@mandrakesoft.com>, 1999 |
copy_to_user(9) |