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

时间:2009-10-30 12:02:44

标签: c++ memory alignment dma

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

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

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

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

pPattern是一个指向int的指针,它是我的缓冲区的开始,DmaBufferSizeinInt32s深。

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

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

正如Goz指出的那样,但是(imo)有点不那么清楚了:你要求通过0x1000字节(第二个参数)进行对齐,这远远超过64位。

您可以将通话更改为:

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

这可能会使通话更便宜(浪费更少的内存),并且在任何情况下都更清晰,因为你要求的东西更贴合你真正想要的东西。

答案 2 :(得分:1)

我不知道你的硬件,我不知道你是如何得到你的pPattern指针,但这似乎有风险。我熟悉的大多数DMA需要物理连续RAM。操作系统仅为用户程序提供几乎连续的RAM。这意味着1 MB的内存分配可能由多达256个未连接的4K RAM页面组成。

大多数时候,内存分配将由连续的物理部分组成,这可能导致事情在大多数时间工作但并非总是如此。您需要内核设备驱动程序来提供安全的DMA。

我对此感到疑惑,因为如果您的pPattern指针 来自设备驱动程序,那么为什么需要更多地对齐?