struct dma_buf { size_t size; // buffer size struct file *file; // binded fd struct list_head attachments; // attached device list const struct dma_buf_ops *ops; // 由exporter 提供 struct mutex lock; unsigned vmapping_counter; // vmap相关,非必要 void *vmap_ptr; const char *exp_n...
在内核中,这是通过调用dma_buf_map_attachment()和dma_buf_unmap_attachment()来完成的。 一旦驱动程序完成了对共享缓冲区的使用,它需要调用dma_buf_detach()(在清理任何映射之后),然后通过调用dma_buf_put()释放通过dma_buf_get()获得的引用。 对于导出者预期实现的详细语义,请参见dma_buf_ops。 CPU对DMA缓...
dma-buf 最初的原型为 shrbuf,由 Marek Szyprowski (Samsung)于2011年8月2日首次提出,他实现了 “Buffer Sharing” 的概念验证(Proof-of-Concept),并在三星平台的 V4L2 驱动中实现了 camera 与 display 的 buffer 共享问题。该 patch 发表后,在内核社区引起了巨大反响,因为当时关于 buffer 共享问题很早就开始...
static void *exporter_kmap(struct dma_buf *dmabuf, unsigned long page_num) { return NULL; } static int exporter_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma) { return -ENODEV; } static const struct dma_buf_ops exp_dmabuf_ops = { .map_dma_buf = exporter_map_dma_buf,...
实现struct dma_buf_ops中的buffer管理回调函数。 允许其他使用者通过dma_buf的sharing APIS来共享buffer。 通过struct dma_buf结构体管理buffer的分配、包装等细节工作。 决策buffer的实际后端内存的来源。 管理好scatterlist的迁移工作。 The buffer-usr 是共享buffer的使用者之一。
实现对buf的操作,比如在用户空间想要操作这块buf需要先map一下,在内核空间相关通过dma或者cpu来访问该buf,或者做cache同步,这些都是由exporter来实现的,如图中左侧的cma_heap_buf_ops结构,就是该实现的一组操作函数。另外为什么需要由exporter来实现呢?因为exporter是清楚这些内存从那里申请的,因此当然清楚怎么map,所以...
dma_buf是核⼼数据结构,可以理解为⽣产者对象。struct dma_buf { size_t size;struct file *file;struct list_head attachments;const struct dma_buf_ops *ops;/* mutex to serialize list manipulation and attach/detach */ struct mutex lock;void *priv;};其中 size为缓冲区⼤⼩ file为指向共享...
因为dev为NULL,所以会调用mips_dma_map_ops---> 在arch/mips/mm/dma-default.c中定义: struct dma_map_ops*mips_dma_map_ops= &mips_default_dma_map_ops;static struct dma_map_opsmips_default_dma_map_ops= { .alloc_coherent= mips_dma_alloc_coherent, ....
dma-buf 由浅⼊深(⼀) —— 最简单的 dma-buf 驱动程序 dma-buf 由浅⼊深(⼆) —— kmap / vmap dma-buf 由浅⼊深(三) —— map attachment dma-buf 由浅⼊深(四) —— mmap dma-buf 由浅⼊深(五) —— File dma-buf 由浅⼊深(六) —— begin / end cpu_access ...
dma_free_coherent(&device->dev, size, dma_buf, dma_handle); ``` 9. 关闭DMA通道 在驱动程序卸载或设备停用时,释放DMA通道资源。 ```c dma_release_channel(device->dma_chan); ``` 以上就是Linux DMA的基本使用流程。实际应用中,可能还需要考虑其他因素,比如内存一致性管理、中断处理和错误处理等,这...