相关疑难解决方法(0)

Linux内核设备驱动程序将DMA转换为内核空间

LDD3(p:453)演示dma_map_single使用作为参数传入的缓冲区.

bus_addr = dma_map_single(&dev->pci_dev->dev, buffer, count, dev->dma_dir);
Run Code Online (Sandbox Code Playgroud)

Q1:这个缓冲区来自哪里/哪里?

kmalloc

Q2:为什么DMA-API-HOWTO.txt状态我可以使用raw kmalloc进行DMA转换?

表格http://www.mjmwired.net/kernel/Documentation/DMA-API-HOWTO.txt

L:51如果您通过页面分配器kmalloc()获取了内存,那么您可以使用从这些例程返回的地址与该内存进行DMA.

L:74你不能接受kmap()调用和DMA的返回.

  1. 所以我可以将返回的地址传递kmalloc给我的硬件设备?
  2. 或者我应该virt_to_bus先运行它?
  3. 或者我应该把它传递给dma_map_single

问题3:DMA传输完成后,我可以通过kmalloc地址读取内核驱动程序中的数据吗?

addr = kmalloc(...);
...
printk("test result : 0x%08x\n", addr[0]);
Run Code Online (Sandbox Code Playgroud)

问题4:将这个用户空间送到用户空间的最佳方式是什么?

  1. copy_to_user
  2. mmap kmalloc内存?
  3. 其他?

linux linux-device-driver linux-kernel dma

8
推荐指数
1
解决办法
6453
查看次数

是否每个 dma_map_single 调用都需要相应的 dma_unmap_single?

我正在将大型代码库移植到 Linux 内核设备驱动程序。ASIC 使用大量 DMA 通道。

我 kmalloc 内存与GFP_KERNEL|GFP_DMA. 在启动 DMA 之前,我使用 dma_map_single 来获取硬件(物理)内存地址以提供给硬件。(也会刷新/使 dcache 中的内存无效?)我有时需要 CPU 访问数据,一旦 DMA 完成,但不经常。在通过代码访问数据之前,我执行了 dma_unmap_single 以避免缓存一致性问题。

在我不需要 CPU 访问的情况下,我还需要调用dma_unmap_single吗?我应该dma_unmap_single每一个指针dma_map_single吗?是否dma_map_single消耗dma_unmap_single将释放的资源(例如,表条目)?

DMA-API.txt 不清楚良好的 DMA 内存卫生。

谢谢!

linux linux-device-driver linux-kernel

5
推荐指数
1
解决办法
4464
查看次数

标签 统计

linux ×2

linux-device-driver ×2

linux-kernel ×2

dma ×1