Content-type: text/html
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 );
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].
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; ...