我一直在努力争取这个,真的很感激一些帮助。我想使用我的At91sam9g45的内部SRAM(垫脚石 - 开机后不使用)来加速一些密集型计算,并且无法满足以下所有条件:
可以从用户空间访问内存。使用用户空间mmap()
然后使用内核remap_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并使用Google搜索,但我看不到任何使用非kmalloc内存用于DMA API的示例(PCI总线除外)。