it-swarm.com.de

copy_to_user undefined in Linux Kernel Version 4.12.8

In meinem Projekt verwende ich einen Char-Treiber, um zwischen Benutzer- und Kernelbereich zu kommunizieren. Ich verwende die Funktion copy_to_user(void user *to, const void *from, unsigned long n), um Daten aus dem Kernel-Space in den User-Space-Puffer zu kopieren. Diese Funktion finden Sie unter #include < asm/uaccess.h >-Header-Datei. Ich habe das Projekt mit der Linux-Kernel-Version 4.4.0-59-Generic, Ubuntu OS-Version 16.04 LTS und dessen fehlerfreier Funktion ohne Fehler und Warnung ausgeführt. Ich bekomme die gewünschte Ausgabe.

Ich habe dasselbe Projekt mit Linux Kernel Version 4.12.8, Ubuntu OS Version 16.04.2 LTS kompiliert, und es wird eine Warnung während der Kompilierungszeit WARNING: "copy_to_user" [/home/ldrv1/Desktop/Vijay/code/build/uts.ko] undefined! ausgegeben. Wenn ich von meinem Modul insmod mache, erhalte ich eine Fehlermeldung wie folgt: insmod: ERROR: could not insert module uts.ko: Unknown symbol in module. Ich denke, dass die #include <asm/uaccess.h>-Header-Datei in der 4.12.8-Kernel-Version noch unterstützt wird. Andernfalls hätte ich einen schwerwiegenden Fehler erhalten: Kein solcher Datei- oder Verzeichnisfehler beim Kompilieren. Ich habe versucht, die Linux-Kernel-Header mit dem Befehl apt-get install linux-headers-$(uname -r) zu aktualisieren, und ich erhielt die folgende Antwort: 

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'

Diese OS-Version 16.04.2 LTS hat Linux-Header-4.10.0-35. Wie kann ich diese Warnung beseitigen? Anregungen und Support werden geschätzt. Wenn Sie weitere Informationen benötigen, wenden Sie sich bitte an uns. 

  1. Sie sollten #include <linux/uaccess.h> für 4.12.8 . Verwenden. Hier ist die Definition .

    In 4.4 verwenden einige Treiber #include <asm/uaccess.h>, während die anderen #include <linux/uaccess.h> verwenden.

    #include <linux/uaccess.h> ist vorzuziehen, denke ich.

  2. Sie sollten apt-get update und dann apt-get install linux-headers-generic ausführen.

7
user8549610

Die Funktion copy_to_user und copy_from_user ist inasm/uaccess.hdefiniert. Ich denke, Sie haben ein Problem, wenn Sie diese Funktion definieren. Ich habe den Zeichengerätetreiber mit einem Beispiel zum Datentransfer zwischen Kernelbereich und Benutzerraum geschrieben. Sehen Sie sich mein Github an: mein Code als Referenz. Bitte ankreuzen, wenn es Ihnen hilfreich erscheint :). In Beispiel 3 gibt es einen kleinen Fehler. Ich denke an sie, aber Beispiel 1 und Beispiel 2 funktionieren gut

0
Hai Dang

Die Antwort von Bronislav Elizaveti ist richtig. Anstelle von #include <asm/uaccess.h> wenn wir #include <linux/uaccess.h> verwenden, erhalten wir keine Warnung. Wenn Sie weiterhin #include <asm/uaccess.h> verwenden möchten, ändern Sie die Funktion in _copy_to_user (void user * to, const void * from, unsigned long n) anstelle von copy_to_user (void user * to , const void * from, unsigniert lang n). Ein einfaches _ erledigt die Arbeit.