繁体   English   中英

将内存从一个内核模块映射到另一个模块中的DMA缓冲区

[英]Remapping memory from one kernel module to a DMA buffer in another module

我正在一个项目中,其中模块A具有一个具有DMA内容的内存缓冲区,并调用模块B的函数来执行DMA操作。 简单起见,如下所示:

模块A:

void get_info()
{
    void *outBuffer = kmalloc(10);
    void *inBuffer = kmalloc(10);

    perform_dma(outBuffer);       // function from module B

    read_output(&inBuffer);      // function from module B
}

模块B:

void perform_dma(void *outBuffer)
{
    void *dma_buffer = dma_alloc_coherent()  // <-- allocate a new DMA buffer
    memcpy(dma_buffer, outBuffer, 10);

    do_dma();  // <-- after this is done, dma_buffer has the content module A needs.
}

void read_output(void **inBuffer)
{
    memcpy(*inBuffer, dma_buffer, 10);
}

我了解这可能并不高效,但我无法更改模块B ,只能使用提供的API。 在最佳情况下,我可以将Bperform_dma(void *outBuffer)原型更改为perform_dma(void **outBuffer) 它大部分时间都有效,但是在某种情况下(由于整个项目中涉及的所有中断/队列事件),我将无法显式调用read_output()并提供inBuffer来读取内容,但只能访问outBuffer地址发送给B之后

有没有办法将模块A的 outBuffer映射到模块B中分配的dma_buffer ,以便能够从同一outBuffer读回输出?

我发现dma_map_single()/ dma_unmap_single()在我的情况下有效。 根本不需要更改功能原型。 只需在perform_dma()内使用dma_map_single(outBuffer ....,DMA_BIDIRECTIONAL)来获取总线地址并将其传递给dma控制器,因此在完成DMA之后,outBuffer将从dma控制器返回内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM