2009-10-30 15 views
8

Sto utilizzando un'interfaccia hardware per inviare dati che richiedono l'installazione di un buffer DMA, che deve essere allineato su limiti a 64 bit.Come si assicura che la memoria del buffer sia allineata?

Il motore DMA prevede che i buffer siano allineati su limiti di almeno 32 bit (4 byte). Per prestazioni ottimali di , il buffer deve essere allineato su limiti a 64 bit (8 byte). La dimensione del trasferimento deve essere un multiplo di 4 byte.

Io uso posix_memalign per creare un buffer come questo ...

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

pPattern è un puntatore ad un int, ed è l'inizio del mio tampone che è DmaBufferSizeinInt32s profondo.

Il mio buffer è allineato su 64 bit?

risposta

8

Sì, il buffer è allineato su 64 bit. È ANCHE allineato su un limite di 4 KByte (da qui il 0x1000). Se non si desidera che il 4 KB allineamento poi passare 0x8 anziché 0x1000 ...

Edit: Vorrei anche notare che di solito durante la scrittura di catene DMA li sta scrivendo attraverso la memoria non memorizzata nella cache o attraverso una sorta di non-cache coda di scrittura basata. Se questo è il caso, si desidera allineare le catene DMA alle dimensioni della riga della cache per evitare che la write-back della cache sovrascriva l'inizio o la fine della catena DMA.

+0

Non sono sicuro se ho bisogno dell'allineamento del bordo 4KByte ... dovrei? – Krakkos

+0

Fondamentalmente sto scrivendo oggetti dati che sono 10 x 32 bit di parole. Voglio inviare numeri interi di 10 x 32 bit ogni volta. Attualmente sono DMA'ing 400 x 320 bit di dati in ogni trasferimento DMA. Non sono sicuro di come la dimensione del mio buffer (400 x 10 x 32 bit) sia correlata all'allineamento, se non del tutto. Dovrei modificare la dimensione del buffer? – Krakkos

+0

Non posso rispondere a questa domanda. Non so qual è la tua piattaforma, per esempio. Sotto Windows le pagine di memoria sono allocate in pagine 4K. Questo significa che puoi solo impostare un'intera pagina alla volta senza cache e quindi potresti aver bisogno dell'allineamento 4K. Ahimè, però, non posso dirlo con certezza senza sapere molto di più sul tuo sistema ...Il sistema – Goz

2

Come ha sottolineato Goz, ma (imo) un po 'meno chiaramente: si chiede l'allineamento di 0x1000 byte (il secondo argomento), che è molto più di 64 bit.

si potrebbe cambiare la chiamata a poco:

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

Questo potrebbe rendere la chiamata più economico (meno memoria sprecata), e in ogni caso è più chiara, dal momento che si chiede qualcosa che più si avvicina quello che effettivamente volere.

+0

OK, penso di vedere ora ... l'argomento centrale di 'posix_memalign', è l'allineamento. E mentre il mio valore era un fattore di 64 bit, in realtà era impostato su 4096 byte. – Krakkos

1

Non conosco il tuo hardware e non so come si ottiene il puntatore pPattern, ma questo sembra rischioso tutto intorno. La maggior parte dei DMA con cui ho familiarità richiede RAM fisica continua. Il sistema operativo fornisce solo una RAM praticamente continua ai programmi utente. Ciò significa che un'allocazione di memoria di 1 MB potrebbe essere composta da un massimo di 256 pagine RAM 4K non connesse.

Gran parte delle allocazioni di memoria del tempo saranno fatte di pezzi fisici continui che possono portare a cose che funzionano la maggior parte del tempo ma non sempre. È necessario un driver di periferica del kernel per fornire un DMA sicuro.

Mi chiedo questo perché se il puntatore pPattern è proveniente da un driver di periferica, allora perché è necessario allinearlo di più?

+0

Immagino che il problema dipenda dal fatto che sia necessario più di 4K di RAM ... – Goz

Problemi correlati