3

Dans mon projet, j'utilise un pilote char pour communiquer entre l'espace utilisateur et l'espace 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 vers le tampon d'espace utilisateur. Nous pouvons trouver cette fonction sous le fichier d'en-tête #include <asm/uaccess.h>. J'ai respecté le projet en utilisant Linux Kernel version 4.4.0-59-generic, Ubuntu OS version 16.04 LTS et son fonctionnement correct sans erreur ni avertissement. Je reçois la sortie désirée.copy_to_user non défini dans la version du noyau linux 4.12.8

J'ai compilé le même projet en utilisant Linux noyau version 4.12.8, Ubuntu OS version 16.04.2 LTS et il me jette 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 l'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 supporté dans la version du noyau 4.12.8 sinon j'aurais eu une erreur fatale: pas d'erreur de fichier ou de répertoire lors de la compilation. J'ai essayé de mettre à jour les en-têtes du noyau Linux en utilisant la commande apt-get install linux-headers-$(uname -r) et je suis 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 OS 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 nécessaires, n'hésitez pas à demander.

Répondre

3
  1. Vous devez utiliser #include <linux/uaccess.h> pour 4.12.8. Voici le definition.

    Dans 4.4 certains pilotes utilisent #include <asm/uaccess.h> tandis que les autres utilisation #include <linux/uaccess.h>.

    #include <linux/uaccess.h> est préférable, je pense. Vous devez faire apt-get update puis apt-get install linux-headers-generic.

+0

Merci Bronislav. Votre solution a fonctionné. –

+0

Vous êtes les bienvenus. –

0

La fonction copy_to_user et copy_from_user défini 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 un exemple sur le transfert de données entre l'espace du noyau et l'espace utilisateur. Voir mon github: my code pour référence. S'il vous plaît star si vous sentez que c'est utile pour vous :). il a un petit bug dans l'exemple 3. Je les trouve, mais l'exemple 1 et l'exemple 2 fonctionnent bien

+0

Salut Hai, j'ai eu une solution pour ma question, je suis passé par votre exemple de code et c'est bien. Je t'ai donné une étoile. Merci pour votre réponse. :) –

0

Réponse donnée par Bronislav Elizaveti est correct. Au lieu de #include < asm/uaccess.h> si nous utilisons #include < linux/uaccess.h> nous ne recevrons pas l'avertissement. Si vous voulez toujours utiliser #include < asm/uaccess.h> seulement alors changez la fonction en _copy_to_user (void user * pour, const void * from, unsigned long n) au lieu de copy_to_user (void user * pour, const void * de, non signé long n). Un simple _ fera le travail.