屏蔽DMA分配内存的物理地址是否有效?

时间:2017-09-25 10:41:30

标签: linux linux-kernel arm fpga dma

我正在编写一个Linux内核驱动程序,它需要告诉FPGA一个RAM中的基地址来写入。
内存驱动程序使用dma_alloc_coherent分配内存。 这将生成32位物理地址和内核虚拟地址,物理地址将传递给FPGA FPGA是带有嵌入式ARM Cortex-A9的Cyclone V,带有驱动程序的嵌入式Linux正在运行 现在的问题是,FPGA架构仅产生27位宽的总线来寻址sdram,而由dma调用产生的物理地址具有32位,例如,物理地址为0x2f220000,超过27位跨度 我想知道,如果可以屏蔽最重要的5位并告诉FPGA地址0x7220000并且仍然具有正确的行为(在文档中说明,物理地址应该被转换为总线宽度,这意味着掩盖,因为我不能在处理器中使用27位) 还可以使用简单的memcpy命令访问DMA内存,该命令从内核虚拟地址复制到缓冲区吗? 提前谢谢。

1 个答案:

答案 0 :(得分:2)

答案真正取决于设备的物理内存布局。如果FPGA的地址总线补充了丢失的位,以便实际地址解析为正确的存储器,那么屏蔽可能是正常的。如果没有,那么Linux内核返回给你的内存可能只是FPGA可以访问的内存。如果是这种情况,你将不得不找到一种方法来让Linux只为你提供可访问的内存缓冲区。