8

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

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

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

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

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

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

4

3 回答 3

8

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

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

于 2009-10-30T12:06:41.767 回答
3

正如 Goz 指出的那样,但(imo)不太清楚:您要求按 0x1000 字节(第二个参数)对齐,这远远超过 64 位。

您可以将调用更改为:

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

这可能会使调用更便宜(更少浪费的内存),并且在任何情况下都更清晰,因为您要求的东西与您实际想要的更接近。

于 2009-10-30T12:53:02.843 回答
0

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

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

我想知道这一点,因为如果您的 pPattern 指针来自设备驱动程序,那么您为什么需要更多地对齐它?

于 2009-10-30T17:28:51.147 回答