屏蔽 DMA 分配内存的物理地址是否有效?
Is masking physical address of DMA allocated memory valid?
我目前正在编写 Linux 内核驱动程序,它需要告诉 FPGA RAM 中要写入的基地址。
内存在内核驱动程序中分配 dma_alloc_coherent
。
这将生成一个32位物理地址和一个内核虚拟地址,物理地址正在传递给FPGA。
FPGA是Cyclone V,内嵌ARM Cortex-A9,内嵌Linux,驱动是运行.
现在的问题是,FPGA 结构只生成一个 27 位宽的总线来寻址 sdram,而由 dma 调用生成的物理地址有 32 位,例如第 th 个物理地址已 0x2f220000
,超过 27 位跨度。
我想知道,是否可以屏蔽最重要的 5 位并告诉 FPGA 地址 0x7220000
并且仍然具有正确的行为(在文档中说明,物理地址应转换为总线宽度,那将意味着屏蔽,因为我不能在处理器中使用 27 位)。
也可以使用简单的 memcpy 命令访问 DMA 内存,从内核虚拟地址复制到缓冲区吗?
提前致谢。
答案确实取决于您设备的物理内存布局。如果 FPGA 的地址总线补充了缺失的位,从而使实际地址解析为正确的内存,那么掩码可能就可以了。如果不是,那么 Linux 内核返回给您的内存可能只是 FPGA 可以访问的。如果是这种情况,您将不得不找到一种方法来要求 Linux 只为您提供可访问的内存缓冲区。
我目前正在编写 Linux 内核驱动程序,它需要告诉 FPGA RAM 中要写入的基地址。
内存在内核驱动程序中分配 dma_alloc_coherent
。
这将生成一个32位物理地址和一个内核虚拟地址,物理地址正在传递给FPGA。
FPGA是Cyclone V,内嵌ARM Cortex-A9,内嵌Linux,驱动是运行.
现在的问题是,FPGA 结构只生成一个 27 位宽的总线来寻址 sdram,而由 dma 调用生成的物理地址有 32 位,例如第 th 个物理地址已 0x2f220000
,超过 27 位跨度。
我想知道,是否可以屏蔽最重要的 5 位并告诉 FPGA 地址 0x7220000
并且仍然具有正确的行为(在文档中说明,物理地址应转换为总线宽度,那将意味着屏蔽,因为我不能在处理器中使用 27 位)。
也可以使用简单的 memcpy 命令访问 DMA 内存,从内核虚拟地址复制到缓冲区吗?
提前致谢。
答案确实取决于您设备的物理内存布局。如果 FPGA 的地址总线补充了缺失的位,从而使实际地址解析为正确的内存,那么掩码可能就可以了。如果不是,那么 Linux 内核返回给您的内存可能只是 FPGA 可以访问的。如果是这种情况,您将不得不找到一种方法来要求 Linux 只为您提供可访问的内存缓冲区。