如何确保缓冲存储器对齐?

Kra*_*kos 9 c++ memory alignment dma

我使用硬件接口发送数据,要求我设置DMA缓冲区,需要在64位边界上对齐.

DMA引擎期望缓冲区在至少32位边界(4字节)上对齐.为获得最佳性能,缓冲区应在64位边界(8字节)上对齐.传输大小必须是4个字节的倍数.

posix_memalign用来创建这样的缓冲区......

posix_memalign ((void**)&pPattern, 0x1000, DmaBufferSizeinInt32s * sizeof(int) ) )
Run Code Online (Sandbox Code Playgroud)

pPattern是一个指向int的指针,并且是我的缓冲区的开始DmaBufferSizeinInt32s.

我的缓冲区是否在64位上对齐?

Goz*_*Goz 8

是的,您的缓冲区在64位上对齐.它也在4 KB的边界上对齐(因此为0x1000).如果您不想要4 KB对齐,则传递0x8而不是0x1000 ...

编辑:我还要注意,通常在编写DMA链时,您通过未缓存的内存或通过某种非基于缓存的写入队列来编写它们.如果是这种情况,您希望将DMA链与高速缓存行大小对齐,以防止高速缓存写回覆盖DMA链的开头或结尾.