Question

J'utilise une interface matérielle pour envoyer des données qui nécessitent de configurer un tampon DMA . , qui doit être aligné sur des limites de 64 bits.

Le moteur DMA s'attend à ce que les mémoires tampons soient alignées sur des limites d'au moins 32 bits (4 octets). Pour optimale performances, la mémoire tampon doit être alignée sur des limites de 64 bits (8 octets). La taille du transfert doit être un multiple de 4 octets.

J'utilise posix_memalign pour créer un tampon comme celui-ci ...

posix_memalign ((void**)&pPattern, 0x1000, DmaBufferSizeinInt32s * sizeof(int) ) )

pPattern est un pointeur sur un int et constitue le début de mon tampon, qui est DmaBufferSizeinInt32s .

Mon tampon est-il aligné sur 64 bits?

Était-ce utile?

La solution

Oui, votre tampon est aligné sur 64 bits. Il est ÉGALEMENT aligné sur une limite de 4 Ko (d'où le 0x1000). Si vous ne voulez pas l’alignement de 4 Ko, passez 0x8 au lieu de 0x1000 ...

Modifier: Je voudrais également noter que généralement lors de l’écriture de chaînes DMA, vous les écrivez dans de la mémoire non mise en cache ou via une sorte de file d’écriture non basée sur le cache. Si tel est le cas, vous souhaitez également aligner vos chaînes DMA sur la taille de la ligne de cache afin d'éviter une réécriture de cache qui écrase le début ou la fin de votre chaîne DMA.

Autres conseils

Comme Goz l'a fait remarquer, mais (imo) un peu moins clairement: vous demandez un alignement de 0x1000 octets (le deuxième argument), ce qui est beaucoup plus que 64 bits.

Vous pouvez changer l'appel simplement:

posix_memalign ((void**)&pPattern, 8, DmaBufferSizeinInt32s * sizeof(int)))

Cela pourrait rendre l’appel moins cher (moins de mémoire gaspillée) et, en tout cas, plus clair, puisque vous demandez quelque chose qui correspond davantage à ce que vous voulez réellement.

Je ne connais pas votre matériel et comment vous obtenez votre pointeur Patron, mais cela semble risqué. La plupart des DMA que je connais nécessitent une RAM physique continue. Le système d'exploitation ne fournit qu'une mémoire virtuelle quasi continue aux programmes utilisateur. Cela signifie qu'une allocation de mémoire de 1 Mo peut être composée d'un maximum de 256 pages RAM 4K non connectées.

Une grande partie de l’allocation de temps mémoire sera constituée de pièces physiques continues, ce qui peut entraîner des problèmes de fonctionnement la plupart du temps, mais pas toujours. Vous avez besoin d’un pilote de périphérique du noyau pour fournir un DMA sécurisé.

Je m'interroge à ce sujet car si votre pointeur pPattern provient d'un pilote de périphérique, pourquoi avez-vous besoin de l'aligner davantage?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top