Domanda

Sto utilizzando un'interfaccia hardware per inviare dati che mi richiedono di impostare un DMA , che deve essere allineato su limiti a 64 bit.

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

Uso posix_memalign per creare un buffer come questo ...

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

pPattern è un puntatore a un int ed è l'inizio del mio buffer che è DmaBufferSizeinInt32s in profondità.

Il mio buffer è allineato a 64 bit?

È stato utile?

Soluzione

Sì, il buffer è allineato a 64 bit. È ANCHE allineato su un limite di 4 KByte (quindi 0x1000). Se non si desidera l'allineamento di 4 KB, passare 0x8 invece di 0x1000 ...

Modifica: vorrei anche notare che di solito quando si scrivono catene DMA le si scrive attraverso la memoria non memorizzata nella cache o tramite una sorta di coda di scrittura non basata su cache. Se questo è il caso, si desidera allineare le catene DMA alle dimensioni della linea della cache per evitare che una riscrittura della cache sovrascriva l'inizio o la fine della catena DMA.

Altri suggerimenti

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

È possibile modificare la chiamata in solo:

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

Ciò potrebbe rendere la chiamata più economica (meno memoria sprecata), e in ogni caso è più chiara, poiché si chiede qualcosa che corrisponda più strettamente a ciò che si desidera effettivamente.

Non conosco il tuo hardware e non so come stai ottenendo il tuo puntatore pPattern, ma questo sembra rischioso dappertutto. La maggior parte dei DMA che conosco richiede RAM fisica continua. Il sistema operativo fornisce solo 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 del tempo le allocazioni di memoria saranno fatte di pezzi fisici continui che possono portare a cose che funzionano il più delle volte ma non sempre. È necessario un driver di dispositivo kernel per fornire DMA sicuro.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top