C'est peut-être une question idiote, mais je ne l'ai pas si loin à propos de DMA. Lorsque vous effectuez une mémoire DMAing, vous devez allouer le tampon DMA (par exemple avec dma_alloc_coherent()
), puis pour chaque transfert, nous devons copier le tampon dans la mémoire allouée (tampon source), puis déclencher la transaction DMA.Transaction DMA nécessite la copie dans le tampon à chaque fois?
Ainsi, si elle a besoin memcpy()
supplémentaire pour chaque transaction, quel est l'avantage d'utiliser DMA?
Procédure pour la copie source à la destination - sans DMA:
- tampon de copie (
memcpy()
) de la source à destination
étapes pour copier la source vers la destination - avec DMA:
- copie tampon (
memcpy()
) de la source à tampon DMA - transaction DMA de déclenchement (qui copie le tampon éventuellement à tampon de destination)
Un exemple de ce problème est avec le pilote Ethernet, qui ont besoin de copier de la sk_buf
Recieved en adresse physique du FPGA. Dans ce cas, il faut d'abord copier le sk_buf
dans le tampon source DMA (à partir de dma_alloc_coherent()
).
De quel pilote parlez-vous exactement? Pouvez-vous nous montrer du vrai code ** dans le noyau principal ** où vous voyez le problème? –
Il est un peu difficile de trouver un exemple simple dans le noyau. J'écris mon propre pilote ethernet, et je ne suis pas sûr que l'utilisation de dma est efficace - comme je l'ai écrit. S'il y a une erreur dans mes questions ou hypothèses, j'aimerais savoir. – ransh