Pergunta

Eu estou usando uma interface de hardware para enviar dados que me exige a criação de um DMA tampão , que precisa estar alinhado em 64 bits limites.

Os espera do motor de DMA buffers para ser alinhada com, pelo menos, 32 bits de limites (4 bytes). para um óptimo o desempenho do tampão deve ser alinhado em 64 bits de limites (8 bytes). O tamanho de transferência deve ser um múltiplo de 4 bytes.

Eu uso posix_memalign para criar um buffer assim ...

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

pPattern é um ponteiro para um int, e é o começo da minha tampão que é DmaBufferSizeinInt32s profunda.

O meu tampão alinhado em 64bits?

Foi útil?

Solução

Sim, o buffer está alinhado em 64-bits. Também é alinhado em um limite de quatro KByte (daí a 0x1000). Se você não quer que o 4 KB alinhamento em seguida, passar 0x8 em vez de 0x1000 ...

Edit: Gostaria igualmente de notar que, geralmente, quando se escreve cadeias DMA que você está escrevendo-los através de memória sem cache ou através de algum tipo de não-cache fila de gravação baseada. Se este for o caso você deseja alinhar suas cadeias de DMA para o tamanho da linha de cache, bem como para impedir que um cache write-back substituindo o início ou o fim de sua cadeia de DMA.

Outras dicas

Como Goz apontou, mas (IMO) um pouco menos clara: você está pedindo para o alinhamento de 0x1000 bytes (o segundo argumento), que é muito mais do que 64 bits

.

Você pode alterar a chamada para apenas:

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

Isso pode fazer a chamada mais barato (memória menos desperdício), e em qualquer caso, é claro, desde que você pedir algo que melhor corresponda ao que você realmente quer.

Eu não sei o seu hardware e eu não sei como você está recebendo o ponteiro pPattern, mas isso parece arriscado todo. A maioria DMA Estou familiarizado com requer RAM contínua física. O sistema operacional só fornece RAM praticamente contínua para programas do usuário. Isso significa que uma alocação de memória de 1 MB pode ser composta por até 256 desconexos páginas de 4K RAM.

Grande parte das alocações de memória de tempo será feita de peças físicas contínuas que podem levar a coisas trabalhando a maior parte do tempo, mas nem sempre. Você precisa de um driver de dispositivo do kernel para fornecer DMA seguro.

Gostaria de saber sobre isso porque se o ponteiro pPattern é vindo de um driver de dispositivo, então por que você precisa para alinhá-lo mais?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top