web-dev-qa-db-fra.com

copy_to_user indéfini dans la version 4.12.8 du noyau Linux

Dans mon projet, j'utilise un pilote de caractères pour communiquer entre l'espace utilisateur et l'espace du noyau. J'utilise la fonction copy_to_user(void user *to, const void *from, unsigned long n) pour copier des données de l'espace noyau dans la mémoire tampon de l'espace utilisateur. Nous pouvons trouver cette fonction dans le fichier d’en-tête #include < asm/uaccess.h > . Je me suis conformé au projet à l’aide du noyau Linux version 4.4.0-59-generic, du système d’exploitation Ubuntu version 16.04 LTS et fonctionne sans erreur ni avertissement. Je reçois la sortie désirée.

J'ai compilé le même projet à l'aide de la version 4.12.8 du noyau Linux et de la version 16.04.2 LTS du système d'exploitation Ubuntu, ce qui me renvoie un avertissement lors de la compilation WARNING: "copy_to_user" [/home/ldrv1/Desktop/Vijay/code/build/uts.ko] undefined!. Quand je fais insmod de mon module, je reçois une erreur comme suit insmod: ERROR: could not insert module uts.ko: Unknown symbol in module. Je pense que le fichier d'en-tête #include <asm/uaccess.h> est toujours pris en charge dans la version 4.12.8 du noyau, sinon j'aurais une erreur fatale: aucune de ces erreurs de fichier ou de répertoire lors de la compilation. J'ai essayé de mettre à jour les en-têtes du noyau Linux à l'aide de la commande apt-get install linux-headers-$(uname -r) et j'ai obtenu la réponse suivante: 

Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package linux-headers-4.12.8
E: Couldn't find any package by glob 'linux-headers-4.12.8'
E: Couldn't find any package by regex 'linux-headers-4.12.8'

Cette version de système d'exploitation 16.04.2 LTS a linux-headers-4.10.0-35 . Comment puis-je me débarrasser de cet avertissement? Suggestions et soutien appréciés. Si plus d'informations sont requises, n'hésitez pas à demander. 

  1. Vous devriez utiliser #include <linux/uaccess.h> pour 4.12.8 . Voici la definition .

    Dans 4.4, certains pilotes utilisent #include <asm/uaccess.h> tandis que d'autres Utilisent #include <linux/uaccess.h>.

    #include <linux/uaccess.h> est préférable, je pense.

  2. Vous devriez faire apt-get update puis apt-get install linux-headers-generic.

7
user8549610

Les fonctions copy_to_user et copy_from_user définies dans asm/uaccess.h. Je pense que vous avez un problème lorsque vous définissez cette fonction. J'ai écrit le pilote de périphérique de caractères avec quelques exemples sur le transfert de données entre l'espace noyau et l'espace utilisateur. Voir mon github: mon code pour référence. S'il vous plaît étoiles si vous pensez que cela est utile pour vous :). il y a un petit bug dans l'exemple 3. Je les calcule, mais l'exemple 1 et l'exemple 2 fonctionnent bien

0
Hai Dang

La réponse donnée par Bronislav Elizaveti est correcte. Au lieu de #include <asm/uaccess.h> si nous utilisons #include <linux/uaccess.h>, nous n'obtiendrons pas l'avertissement. Si vous souhaitez toujours utiliser #include <asm/uaccess.h>, changez alors la fonction en _copy_to_user (utilisateur void * à, const void * de, unsigned long n) au lieu de copy_to_user (utilisateur void * à, const vide * de, non signé long n). Un simple _ fera le travail.