wie ist der richtige Weg, um copy_from_user?
Ich versuche einen Wert kopieren von user-space kernel-space mit der Funktion:
static ssize_t device_write(struct file *filp, const char *buff, size_t len, loff_t *off)
{
unsigned long copy=0;
int desp=0;
copy = copy_from_user(&desp, &len, 4);
printk(KERN_ALERT "copy: %lx\n", copy);
printk(KERN_ALERT "desp: %d\n", desp);
}
wo "len" ist die variable, die vorhanden ist in den user-space, und ich möchte um es zu kopieren "desp" in den kernel-space
dem Aufruf der Funktion mache ich aus dem user-space ist (schreiben ist device_write nach struct file_operations):
write (fd,buffer,8, &off);
wenn ich drucken Sie den Wert, der gespeichert werden soll in der "desp" ist immer 0 (8).
Was ist das problem in meinem code? Ich habe gesehen, einige Beispiele und ich implementiert, viele Varianten, aber keiner funktioniert.
InformationsquelleAutor eduardosufan | 2013-07-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
write
Funktionsprototyp in der Anleitung ist:ssize_t write(int fd, const void *buf, size_t count);
So brauchen Sie nur pass 3 Werte zu
write
, nämlich: der file-Deskriptorfd
,buffer
wo Ihre Daten liegt, und diecount
von bytes, die Sie schreiben möchten.Diese in Bezug auf den user-space. Lassen Sie uns nun bewegen, um den kernel-space-lese-Funktion, d.h. Ihre
device_write
.Dem argument
buf
zu dieser Funktion ist das eine, die Daten enthält, die Sie schreiben wollen, aus dem user-spacecount
ist die Länge der gesendeten Daten geschrieben werden, indem der kernel. So sollen Sie zum kopieren von Daten vonbuf
Zeiger und nichtlen
.So, der korrekte Weg wäre:
Sollte dies tun.
InformationsquelleAutor Pramod Gurav
len
hat nicht vorhanden ist in den user-space. Es wird als Wert übergeben, solen
zugänglich ist, wie eine normale variable im kernel-space.desp = (int)len
ist alles, was Sie brauchen. Beachten Sie jedoch, dass size_t ist nicht das gleiche wie int, und auf 64-bit-Plattformen size_t ist 8 bytes.copy_from_user()
ist, für die Puffer, die Sie versuchen zu schreiben (genanntbuffer
in Ihrem user-space-code, undbuff
im kernel-space argument-Liste). Was übergeben wird ist ein Zeiger auf eine Speicheradresse, die nur vorhanden ist in den user-space, alsocopy_from_user()
Kopien, die Puffer zu einer kernel-space-Puffer.Wie kann man diesen Aufruf aus user-space?
write()
ist ein definiertes system call interface, nimmt 3 Parameter. Die C-Bibliothek und kernel-VFS-layer übersetzen, rufen Sie schließlich in Ihredevice_write()
handler. Sie können nicht fügen Sie einfach ein 4. argument, und der compiler wird nicht lassen Sie. Sind Sie auf der Suche nachpwrite
statt? Sowieso, was hat das zu tun mit Ihrer Frage, welche ich beantwortet? Wenn Sie Fragen bedeuten etwas anderes, fix Ihre Frage'll Lesen Sie über pwrite / Lesen, um zu versuchen, zu implementieren, system-call, vielen Dank!
Peter, pread/pwrite nicht umgesetzt sind in der Struktur struct file operations, in meinem kernel 3.6 (arm) lxr.free-electrons.com/source/include/linux/fs.h?v=3.6;a=arm ich habe die Verwendung von ioctl...
Sie sind immer noch verwirrt über den Unterschied zwischen kernel-space Datei-Operationen Handler und user-space Systemaufrufe. Wenn ein Benutzer will, zu schreiben, um die Datei, ruft er die Funktion schreiben (oder pwrite, oder writev oder pwritev). Von dort werden die C-Bibliothek stellt die Funktion Aufruf in einem system-call. Von hier aus sind Sie im kernel-space. Dann den kernel geht durch die übersetzung mehrere Schritte, bevor Sie rufen, kommt endlich auf die Datei-Operationen-handler. Vertrauen Sie mir! Probieren Sie es aus! Rufen Sie pwrite aus user-space und sehen den Anruf in Ihrem schreiben () - handler.
InformationsquelleAutor Peter