2008-09-15 6 views
3

Ich versuche, eine benutzerdefinierte Struktur aus dem Kernel-Space in Benutzerbereich zu kopieren. Inside user space errno gibt 'schlechte Adresse' zurück. Was ist die übliche Ursache für einen fehlerhaften Adressfehler?Fehler 'falsche Adresse' von copy_to_user

if(copy_to_user(info, &kernel_info, sizeof(struct prinfo))) 

Antwort

5

Bad Address Fehler bedeutet, dass der Adressort, den Sie angegeben haben, ungültig ist. Mit dem Fall, den Sie oben haben, würde ich vermuten, dass es ist, weil Sie eine Kopie von info anstelle eines Zeigers an den Speicherort von info übergeben.

bei der Dokumentation der Suche wird copy_to_user als

definiert
copy_to_user(void __user * to, const void * from, unsigned long n); 

Also, wenn Ihr info Variable ein Zeiger ist, würde ich den Code aktualisieren: ein Zeigertyp

if(copy_to_user(&info, &kernel_info, sizeof(struct prinfo))) { 
    //some stuff here i guess 
} 
2

dass Informationen Unter der Annahme, und diese Information zeigt auf einen gültigen Ort, es ist immer noch möglich, dass die Information auf eine Adresse zeigt, die sich nicht im Benutzerraum befindet, der von der Funktion benötigt wird.

-1

Ich hatte das gleiche Problem beim Schreiben eines kleinen Char-Treibers. Alles, was ich falsch gemacht habe, war die Funktion copy_to_user liefert nicht Null bei einem Fehler, also müssen Sie dies tun ..

if(copy_to_user(void *userbuf, void *kernelbuf, long len)) 
    return -EFAULT; 

// Continue with code.. 
+0

Das ist nicht, was das OP gefragt – Adam