【问题标题】:How to do a single dma transaction in kernel?如何在内核中进行单个 dma 事务?
【发布时间】:2016-02-05 08:56:15
【问题描述】:

我阅读了关于 dma API 的自述文件,但仍然不明白应该如何使用它。 据说 dma_alloc_coherent 负责分配缓冲区,它也负责事务吗? (我在 ivtvfb.c 驱动程序中看到,例如在 fb_write 中,dma_alloc_coherent 的使用就像它实际负责事务一样)

  1. 但是如何触发 dma 事务开始呢?
  2. 完成后有回调吗?

【问题讨论】:

    标签: kernel linux-device-driver dma


    【解决方案1】:

    什么是 DMA 传输?

    DMA 是一种硬件机制,它允许外围组件直接将其 I/O 数据传入和传出主内存,而无需涉及系统处理器。使用这种机制可以大大增加设备的吞吐量,因为主 CPU 消除了大量的计算开销。

    ...dma_alloc_coherent() 的使用就像它实际负责事务一样。

    相反,dma_alloc_coherent() 只是创建一个 dma 控制器可接受的缓冲区,即在主内存中保留一个区域(通常是连续的),可以在 CPU 和 DMA 控制器之间共享。

    例如执行 DMA 写入,CPU 可以填充此缓冲区并指示 DMA 控制器将其写入设备,一旦完成,调用回调函数(通知软件在 CPU 上运行)。

    与此同时,当DMA控制器并行处理向外部设备的数据传输时,CPU可以继续执行其他不依赖于正在传输的数据的无关任务。

    同样,要执行 DMA 读取,CPU 只需将通过调用 dma_allocate_coherent() 获得的缓冲区传递给 DMA 控制器并指示它执行读取。随后 DMA 控制器读取外部设备并开始填充提供的缓冲区,并在缓冲区填充后调用回调函数(半填充在一定时间间隔后配置。)

    进一步阅读:
    Chapter 15 of LDD3 - "mmap and DMA".
    Article on DMA APIs in the Linux kernel.


    通常这取决于 DMA 控制器。 即 DMA 控制器驱动程序提供的 API。

    dma-engine 是多个 DMA 提供商使用的 Linux 内核中的标准框架。

    相关:What is DMA mapping and DMA engine in context of linux kernel?


    dma-engine的情况下:

    完成后有回调吗?

    在从dmaengine_prep_slave_sg()获取的描述符中填充回调指针

    如何触发 dma 事务启动?

    使用dma_async_issue_pending() 并传递初始化的描述符。


    更多详情请参阅dma-engine client documentation

    【讨论】:

    • 谢谢!我还没有检查 dma-engine 框架,但首先尝试了解本机内核 API,例如,我在 ivtvfb.c 代码中看到,在 fb_write 他们使用 dma_alloc_coherent() 就好像该函数执行从 pc 到设备的复制一样.是不是 dma_alloc_coherent 也做交易?
    猜你喜欢
    • 2016-09-04
    • 2019-11-10
    • 2013-08-22
    • 1970-01-01
    • 2012-06-23
    • 2017-06-05
    • 2016-03-31
    • 1970-01-01
    • 2021-02-28
    相关资源
    最近更新 更多