GNU/Linux >> Tutoriels Linux >  >> Linux

copy_to_user() et copy_from_user() pour le type de données de base

Si la fonction reçoit un pointeur aux données de l'espace utilisateur, vous devez utiliser copy_from_user() pour copier les données pointées de l'espace utilisateur vers l'espace noyau (et vice versa).

Notez que la valeur du pointeur elle-même est passée par valeur (comme tous les paramètres C), vous n'avez donc pas à faire un copy_from_user() pour obtenir la valeur du pointeur avant de pouvoir copy_from_user() les données vers lesquelles il pointe.

Les arguments numériques fonctionnent de la même manière que les arguments de pointeur ; en termes C, ce sont tous les deux des scalaires. Vous n'êtes pas obligé d'utiliser copy_from_user() copier la valeur du paramètre ; qui a déjà été copié. Vous n'avez qu'à l'utiliser pour copier les données pointées par un pointeur passé.

Donc si vous avez un paramètre de type int , vous pouvez l'utiliser directement. Si votre paramètre pointe vers un int , puis le int l'objet sera dans l'espace utilisateur et vous devez utiliser copy_to_user pour copier la valeur de cet objet dans l'espace noyau.


Lorsqu'un utilisateur transmet des données à l'espace du noyau, ces données peuvent être réparties sur plusieurs pages, et ces pages peuvent même se trouver dans la mémoire échangée . Dans ces cas, vous devrez attendre que le noyau permute dans la page et accède à la page où se trouvent les données. Dans le cas de types de données élémentaires (comme int ou pointeurs), il est également vrai que certaines architectures (notamment x86 Intel) n'obligent pas l'utilisateur à aligner les données, de sorte que même un entier peut être divisé autour d'une bordure de page. Vous pouvez avoir accès à la première partie de votre entier, mais attendez que la seconde soit échangée par le gestionnaire de mémoire avant d'accéder à tout.

Vous pouvez économiser quelques allers-retours en mettant toutes les données utilisateur dans une structure dont le pointeur est passé au noyau. Vous pouvez le copier_depuis_l'utilisateur en tant que bloc et enregistrer les accès (et courir le risque d'être bloqué plusieurs fois)

Donc, et en guise de conclusion, utilisez les fonctions même pour les types de base , car il y en a beaucoup. N'assumez rien sur l'emplacement des données utilisateur lors de l'exécution en mode noyau. Vous y avez accès, mais les adresses virtuelles du noyau des données utilisateur n'ont rien à voir avec les adresses virtuelles vues en mode utilisateur.


Linux
  1. Bash For Loop Guide et exemples

  2. Quand Dd est-il adapté à la copie de données ? (ou, Quand Read() et Write() sont-ils partiels) ?

  3. Gestion de base des utilisateurs Linux

  4. Existe-t-il un outil en ligne de commande pour la visualisation et l'analyse des données ?

  5. Où Google Chrome pour Linux stocke-t-il les données spécifiques à l'utilisateur ?

Trucs et astuces pour les administrateurs système et les opérations

Comment installer et utiliser Okteta pour les fichiers de données RAW sous Linux

Annonces textuelles au paiement par clic pour les avocats et les avocats

Qu'est-ce qu'une base de données distribuée et à quoi servent les systèmes de données distribués ?

Autorisations de base du répertoire Linux et comment les vérifier

Les 15 meilleurs logiciels économétriques et statistiques pour système Linux