我一直在努力解决这个问题,非常感谢一些帮助。我想使用 At91sam9g45 的内部 SRAM(垫脚石 - 启动后不使用)来加快一些密集计算,但无法满足以下所有条件:
内存可以从用户空间访问。这很容易使用 user space
mmap()
然后 kernelremap_pfn_range()
。使用返回的指针,我的用户空间程序可以读取/写入 SRAM。使用内核 DMA API 调用
dma_async_memcpy_buf_to_buf()
使用 DMA 执行 memcpy。在我的基本驱动程序中,我想调用此操作将数据从 DDR(使用 kmalloc() 分配)复制到 SRAM 缓冲区中。
所以我的问题是我有用户空间和物理地址,但没有内核空间 DMA API 友好映射。
我尝试使用 ioremap 并使用提供给iotable_init()
. 这些似乎都不会导致内核虚拟地址可以与类似的东西一起使用virt_to_bus
(它适用于 kmalloc 地址,我认为在 DMA API 中使用)。
有办法,这只是使用物理地址手动触发 DMA,但我想尝试解决这个问题。我一直在阅读 LDD3 和谷歌搜索,但我看不到任何将非 kmalloc 内存用于 DMA API 的示例(PCI 总线除外)。