我正在测试PCI端点驱动程序,我想从PCI RootPort端到PCI端点端进行简单复制。在PCI端点侧,我们有从PCI地址到CPU物理地址的地址转换。我们可以在转换中配置CPU物理地址,以便映射到特定的DRAM区域。问题是如何在特定的CPU物理地址上分配内存缓冲区,以确保RootPort端的写入真的有效?
任何建议都表示赞赏。非常感谢!
答案 0 :(得分:2)
您需要先保留物理内存区域。最简单但最丑陋的方法是将“mem =”参数传递给内核命令行,从内核内存管理中排除您感兴趣的物理内存范围,然后使用ioremap()获取虚拟内存映射。
例如,如果您的机器有256 Mb的RAM,请使用mem = 255M来保留您使用的最后一个Mb,然后通过ioermap映射它()
注意:根据@Adrian Cox的反馈确定原始答案。
答案 1 :(得分:1)
如果您可以动态重新映射翻译,那么您应该像使用DMA的任何驱动程序一样工作。您对此的基本参考是Chapter 15 of LDD3,加上Linux DMA API。
您通过dma_alloc_coherent
分配的是DMA相干缓冲区。在大多数平台上,您应该能够传入空struct device
指针并获得通用DMA地址。这将为您提供访问数据的内核虚拟地址和dma地址,该地址是映射翻译层的CPU物理地址。
如果您的地址转换不是很灵活,您可能需要修改端点的平台代码,以便尽早保留此缓冲区,以满足地址对齐要求。这有点复杂,但最近的内核有一个update of the bigphysarea补丁可能有助于作为起点。