2016-07-31 3 views
0

Je travaille avec le noyau 3.18 sur ARM. Je lis les données d'une caméra pour laquelle j'écris le pilote. -je utiliser ce qui suit pour mettre en place la mémoire:Où puis-je obtenir vm_area_struct pour remap_pfn_range?

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

Cela fonctionne très bien. J'utilise le même module de noyau pour lire la mémoire après que la caméra a livré les données et que je puisse voir les images.

Maintenant je veux démarrer une application d'espace utilisateur pour lire les mêmes données. Je pense que le chemin à parcourir est remap_pfn_range. Je continue de chercher des exemples, mais une chose qu'ils ne décrivent jamais est l'endroit où je trouve le vm_area_struct. Je suppose que cela doit venir de l'application de l'utilisateur non? Pour le premier argument, il est dit "user vma to map to". Alors, comment puis-je obtenir un pointeur sur cette structure?

+0

Si votre pilote a alloué le tampon avec 'dma_alloc_coherent()', il devrait implémenter les requêtes 'mmap()' pour ce tampon via 'dma_mmap_coherent()', pas en appelant 'remap_pfn_range()' directement. – Notlikethat

+0

Merci pour ce conseil. dma_mmap_coherent semble être la voie à suivre. – pgibbons

Répondre

0

On dirait que le pointeur vma provient de l'application de l'espace utilisateur.

Dans le pilote (espace noyau), j'ai dû créer des méthodes, ainsi qu'un fichier/dev. Ensuite, dans l'application utilisateur, j'ai ouvert le fichier/dev et j'ai appelé mmap dessus. Ceci à son tour a invoqué ma propre méthode mmap dans mon pilote et le vma (vm_area_struct) a été envoyé par magie.