2016-03-23 1 views
0

Je développe un module noyau Linux qui s'interface avec un composant matériel accédant au DDR en utilisant DMA. (En cours d'exécution sur un système sur puce de bras)Vider une plage d'adresses virtuelles

ce que le conducteur fait essentiellement est allouer un tampon (p/kmalloc), et à écrire l'adresse physique (en utilisant virt_to_phys) du tampon au matériel sous-jacent

Lorsque la lecture de la mémoire tampon , les anciennes données semblent être lues, ce qui indique un problème de cache (lors de l'inspection directe du DDR, en ignorant Linux, les nouvelles données sont lues).

Je n'arrive pas à comprendre comment fonctionne le vidage/invalidation de la mémoire cache.

Quelle est la meilleure approche?

En utilisant le noyau 3,14

Répondre

1

Vous avez 2 options:

  1. utilisation cartographie cohérente qui est allouer de la mémoire à l'aide dma_alloc_coherent

  2. utiliser le mappage de streaming qui est la carte la mémoire tampon pour dma en utilisant telling dma_map_single le noyau dans la direction DMA et désimplantez-le après avoir terminé

+0

Merci. Puis-je utiliser l'une ou l'autre des méthodes pour allouer de la mémoire physiquement contiguë? –

+0

sur dma_alloc_coherent vous obtenez un tampon de mémoire physiquement continue. Si vous utilisez dma_map_single, vous devez lui passer un tampon alloué en continu (alloué par exemple en utilisant kmalloc) –