DMA缓存共享机制
一、共享的DMA缓存
应用:1.将视频流解码成适合图像渲染和显示的缓存格式。
2.相机捕获到适合编码和渲染的缓冲区。
要求:
1.支持添加到现存的内核子系统。
2.有允许将常见像素格式和页映射到多设备的硬件。
二、为什么要用DMA缓存共享机制
在不同设备和子系统间共享DMA缓存的统一机制目前还没有形成
不同的解决方案:
1.V4l2拥有“USERPTR”机制,对于不同的设备的内存的访问需要进行用户空间进行映射。
2.同样,wayland和x11拥有他们自己的机制,不过仅仅是在 client and compositor之间共享缓存。
3.其他的SoC提供商,框架和子系统也有他们自己的共享缓存的方法。
存在的问题:
1.在V4l2中,用户空间映射可能是必须的,但是这可能会因为内核空间和用户空间的来回震荡造成overkill。
2.目前还没有统一的共享API,因此没有统一的共享方式。
三、什么是 dma_buf API
用于共享缓冲区的通用内核级框架。
定义新的缓冲区对象,该对象提供导出和使用共享缓冲区的机制。
提供统一的API,允许与缓冲区共享相关的各种操作。

四、dma_buf中定义的operations
attach()
这是一个可选的op,它可以允许导出器收集有关连接设备的信息,它们对缓冲区的需求(如支持存储约束等),然后相应地做出决定。
如果导出器无法满足请求设备的需要,也可以用于返回错误。
detach()
这是一个可选的op,它可以允许导出器决定是否需要迁移后备存储,以及根据仍然连接的设备的更新需求对缓冲区做出类似的决定。

map_dma_buf()
强制性dma_buf_op。
导入设备用于向导出器指示启动DMA访问的请求。
返回已分配的分散页面列表,映射到设备地址空间中。
在调用map_dma_buf()之前,必须至少调用一个attach。
应该增加这个缓冲区的引脚数。

unmap_dma_buf()

  • 强制性dma_buf_op。
  • 导入设备用于向出口商指示DMA访问的结束。
  • 应减少此缓冲区的使用次数。
  • 可能取消固定缓冲区(允许它在内存中移动,换出等)…虽然出于性能原因预计导出器不会不必要地迁移缓冲区。
  • 一旦所有当前用户都放弃了访问权限,导出器可能会决定在平台上根据需要和可能迁移缓冲区存储

五、Buffer Exporter

  • 实现和管理缓冲区上的所有操作
  • 允许其他用户使用dma_buf共享API共享缓冲区
  • 管理内存后备存储的实际分配
  • 可选地,如果可能,在平台上,如果需要,负责散布列表的迁移。
    六、Buffer Importer (user)
  • 是一个(可能很多)共享缓冲区的用户。
  • 不关心缓冲区分配的情况和方法。
  • 需要一种机制来访问构成内存中此缓冲区的分散列表,以便它可以访问它。
    七、API
    dma_buf_export():
    ●用于宣布导出缓冲区的愿望
    ●连接导出器的缓冲区私有元数据,此缓冲区的缓冲区操作实现以及关联文件的标志。
    ●返回dma_buf对象的句柄以及上述所有相关信息。
    dma_buf_fd():
    ●返回与dma_buf对象关联的FD。
    ●然后,用户空间将FD传递给参与共享此dma_buf对象的其他设备/子系统。
    dma_buf_get():
  • 由导入设备用于获取与FD关联的dma_buf对象

dma_buf_attach():

  • 导入设备可以使用dma_buf对象附加自身。
  • 在dma_buf对象共享开始时调用一次。
  • 如果由出口商提供,可以调用attach()dma_buf_op。
  • 返回struct dma_buf_attachment ptr
    dma_buf_map_attachment():
  • 由导入设备用于请求访问缓冲区,以便它可以执行DMA。
  • 内部调用exporter提供的map_dma_buf()dma_buf_op。
  • 返回一个sg_table,其中包含映射在导入设备地址空间中的分散列表。
    dma_buf_unmap_attachment():
  • DMA访问完成后,设备会告诉导出器当前
    通过调用此API完成请求的访问。
  • 内部调用导出器提供的unmap_dma_buf()dma_buf_op。

dma_buf_detach():

  • 在需要访问此dma_buf对象时,导入器设备会告诉导出器其意图从当前共享中“分离”。
  • 如果出口商提供,可以调用detach()dma_buf_op。
    dma_buf_put():
  • 调用dma_buf_detach()后,通过调用dma_buf_put()减少此缓冲区的引用计数。

八、dma_buf usage flow

DMA缓存共享机制(翻译版)

相关文章: