3

我一直在努力解决这个问题,非常感谢一些帮助。我想使用 At91sam9g45 的内部 SRAM(垫脚石 - 启动后不使用)来加快一些密集计算,但无法满足以下所有条件:

  1. 内存可以从用户空间访问。这很容易使用 user spacemmap()然后 kernel remap_pfn_range()。使用返回的指针,我的用户空间程序可以读取/写入 SRAM。

  2. 使用内核 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 总线除外)。

4

0 回答 0