2016-07-31 12 views
0

Ich arbeite mit Kernel 3.18 auf ARM. Ich lese Daten von einer Kamera, für die ich den Treiber schreibe. Ich benutze nach dem der Speicher einzurichten:Woher bekomme ich vm_area_struct für remap_pfn_range?

cpu_handle = dma_alloc_coherent(NULL, dma_size, &dma_handle, GFP_KERNEL | GFP_DMA); 

Das ist sehr gut funktioniert. Ich benutze das gleiche Kernel-Modul, um den Speicher auszulesen, nachdem die Kamera die Daten geliefert hat und ich die Bilder sehen kann.

Jetzt möchte ich eine User Space-Anwendung starten, um die gleichen Daten zu lesen. Ich denke, der Weg zu gehen ist remap_pfn_range.

Ich suche nach Beispielen, aber eine Sache, die sie nie beschreiben, ist, wo ich die vm_area_struct aus bekomme. Ich gehe davon aus, dass dies von der Benutzeranwendung kommen muss, oder? Für das erste Argument steht "user vma to map to". Wie bekomme ich einen Zeiger auf diese Struktur?

+0

Wenn Ihr Treiber den Puffer mit 'dma_alloc_coherent()' zugewiesen hat, sollte er 'mmap()' Anforderungen für diesen Puffer über 'dma_mmap_coherent()' implementieren, nicht durch direkten Aufruf von 'remap_pfn_range()'. – Notlikethat

+0

Danke für diesen Tipp. dma_mmap_coherent scheint der richtige Weg zu sein. – pgibbons

Antwort

0

Sieht so aus, als ob der VMA-Zeiger von der Benutzer-Space-Anwendung kommt.

Innerhalb des Treibers (Kernel-Space) musste ich einige Methoden erstellen, sowie eine/dev-Datei.

Dann in der Benutzeranwendung habe ich die/dev-Datei geöffnet und ich habe mmap darauf aufgerufen. Dies rief wiederum meine eigene mmap-Methode in meinem Treiber hervor und die vma (vm_area_struct) wurde magisch mitgeschickt.