Linux |
CentOS 5.3 |
|
![]() |
put_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 |
![]() |
put_user(9) | ![]() |