iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >201_DMA-BUF简单介绍
  • 314
分享到

201_DMA-BUF简单介绍

linuxandroidjava缓存 2023-08-16 17:08:35 314人浏览 薄情痞子
摘要

一、DMA-BUF等概念的介绍 首先需要明确DMA-BUF,Dma buffer,ioN和DMA-BUF Heap是不同的概念。 在Android 多媒体系统中为了减少因不同进程之间内存的多次拷贝而产生的不必要的开销,最直接的想法是希望跟硬

一、DMA-BUF等概念的介绍

首先需要明确DMA-BUF,Dma buffer,ioN和DMA-BUF Heap是不同的概念。

Android 多媒体系统中为了减少因不同进程之间内存的多次拷贝而产生的不必要的开销,最直接的想法是希望跟硬件设备进行交互的应用能有一个内存能跟设备驱动程序共享数据,理想情况是这个buffer能够直接是通过memory map得到,并且是物理连续的,这样就能让DMA直接读写这块buffer,减少CPU或者外设来访问内存的开销。

为此kernel引入了DMA-BUF这个框架(或者说是子系统),来解决CPU和各种不同外设驱动之间buffer共享的问题。

  • 其中Dma buffer是一块允许在CPU和其他子系统或各种IO外设间共享的buffer。

  • 而DMA-BUF是这个buffer的描述和使用框架。框架提供了对dma-buffer的描述结构体,和基于file的dma-buf使用接口,同时完成了操作时刷cache的动作。

DMA-BUF框架实现了一个dma-buf的文件系统(filesystem),这个文件系统直接通过调用挂载接口挂载到了内核(没有提供挂载节点),每个dma-buf实例,会在文件系统中创建出inode及file,并将fd返回给调用者。调用者通过对file的ioctrl、map等操作,来操作dma-buffer。

也就是说为了实现buffer的共享,DMA-BUF将buffer与file关联起来,通过file来间接的引用和共享buffer, 即 dma-buf 既是块物理 buffer,又是个 linux file。buffer 是内容,file 是媒介,只有通过 file 这个媒介才能实现同一 buffer 在不同驱动之间的流转。

代码位置:

common/driver/dma-buf///或/kernel/msm-5.4/drivers/dma-buf/dma-buf.c

DMA-BUF

如上图中所示,在DMA-BUF框架中有两个很重要的概念,一个是exporter,另一个是importer。

dma buffer 本身由 DMA-BUF exporter 创建,DMA-BUF exporter 是一个驱动程序,它可以分配特定类型的内存,而且还为 kernel、user space、device 提供了多种回调函数来处理 buffer 的 map 和 unmap 问题,所以exporter相当于一个buffer的生产者或者说是提供者。

而DMA-BUF importer则对应dma buffer的使用者,比如上层应用,而因为dma buffer是一种共享内存,所以同一个buffer的importer可以有多个,二者的特性说明:

  1. exporter:

    • 实现struct dma_buf_ops中的buffer管理回调函数;
    • 允许其他消费者通过dma-buf的sharing apiS来共享buffer缓冲区;
    • 通过struct dma_buf结构体管理buffer的分配、包装等细节工作;
    • 决策buffer的实际后端内存的来源;
    • 管理scatterlist迁徙;
  2. importer:

    • 是共享buffer的使用者之一;
    • 无需担心缓冲区是如何/在哪里创建的;
    • 通过struct dma_buf_attachment结构体访问用于构建buffer的scatterlist,并且提供将buffer映射到自己地址空间的机制,这样可以访问到内存的同块区域,实现共享内存

二、基于DMA-BUF框架的内存分配器

过去几年中,Android系统里面已经使用过多种DMA buffer分配方案:首先是PMEM,然后被Android 系统下专用于分配 Graphic Buffer 的内存分配器ION所替换。

ION 是基于 DMA-BUF 实现的,可以在多个设备之间实现 buffer 共享,它的代码一直存放在 staging 目录下,不过再过几年可能就不复存在了,因为ION自从2012年开始商用以来也存在着不少问题。

随后John Stultz发布了一个patch set,实现了DMA-BUF heap,是ION的一个演进版本,在之前的 Android 12 中,GKI 2.0 将 ION 分配器已经被替换为了 DMA-BUF Heap,因为DMA-BUF HEAP的分配器具有更具有稳定的 ABI和安全性,也更标准化。

综上需要明确的是,不管是ION还是DMA-BUF heap都是基于DMA-BUF框架的一种分配器allocator,也就是说ION和DMA-BUF heap是上面DMA-BUF中提到的exporter驱动。

  1. ION分配器:
    ION是基于DMA-BUF框架实现的一种内存分配器,在多媒体部分中使用的最多,从 Camera 到 Display,从 Mediaserver 到 Surfaceflinger,都会利用 ION 进行内存分配管理。

ION提供了多个memory pool,称为“heaps”。它们有不同的属性,例如有的是物理连续的,有的不是。这些heap包括“system”heap,用来供vmalloc_user()分配;“system_contig”h eap,是用kzalloc()分配的。还有“carveout” heap,是在启动阶段就额外划分出来的物理连续区域。应用程序可以用一些user space的API来对这些heap分配、释放、共享内存。

ION的特点是它可以被用户空间的进程之间或者内核空间的模块之间进行内存共享,且这种共享方式是零拷贝的。

代码位置:

//本文的许多结构都是以内核4.14(kernel-4.14)为例,因为在内核5(kernel-5.10)以后的版本中,ION逐渐被弃用,许多代码已经不太相同common/drivers/staging/android/ion/kernel-4.14/drivers/staging/android/ion///或/kernel/msm-5.4/drivers/staging/android/ion/kernel-5.10/drivers/staging/android/ion/

ION

ION 是在各种 heaps 上分配内存,通过 ion_buffer 来描述所分配的内存。

每个heap中分配了若干个buffer,不同的client是通过文件描述符fd来实现内存共享的。

ION是在各种heaps上分配内存,其中定义了四种不同的heap,实现不同的内存分配策略。

  • ION_HEAP_TYPE_SYSTEM : 通过vmalloc分配内存(vmalloc : 虚拟地址连续但物理不连续内存)
  • ION_HEAP_TYPE_SYSTEM_CONTIG: 通过kmalloc分配内存(kmalloc : 物理连续内存)
  • ION_HEAP_TYPE_CARVEOUT: 在保留内存块中(reserve memory)分配内存
  • ION_HEAP_TYPE_CUSTOM: 由客户自己定义
  1. DMA-BUF heaps分配器:
    DMA-BUF heaps也是一种基于DMA-BUF框架实现的内存分配器,是一种取代ION分配的方式。

ION开发的时候,kernel也有一个DMA buffer sharing (DMA-BUF)的API在同时进行开发,此外还有contiguous memory allocator (CMA)。所以功能上有些重复。此外,ION起初是在32-bit ARM处理器上为Android开发的,所以用了一些ARM特有的kernel API。这些都是合入linux mainline的阻碍。而这个新的基于DMA-BUF heap的patch就对ION的内部实现做了彻底的重构,使用CMA来基于某个特殊内存区域实现物理连续heap,也不再使用ARM特有的函数了。patch set还带了一个self-test,展示了API是如何使用的。

DMA-BUF Heap的代码主要位置:

common/driver/dma-buf/heaps///主要文件common/include/linux/dma-heap.hcommon/include/uapi/linux/dma-heap.hcommon/driver/dma-buf/dma-heap.c            //或/msm-kernel/drivers/dma-buf/dma-heap.ccommon/drivers/dma-buf/heaps/system_heap.ccommon/drivers/dma-buf/heaps/cma_heap.c

三、ION heap和 DMA-BUF heap的区别

  1. 分配方式不同
  • ION需要指定堆 ID/掩码和标志(heap id和heap flag)才能进行分配。

  • DMA-BUF heap只需要指定heap的名称就能分配内存

  1. DMA-BUF heap可通过不同的字符设备名控制访问权限,更安全
  • 对于 ION heap而言,所有的内存分配都是从通过访问同一个字符设备 /dev/ion 来完成的。

  • 对于DMA-BUF heap来说,每个DMA-BUF heap都对应生成一个位于/dev/dma_heap/ 的字符设备,因此可以通过 sepolicy 单独控制对每个堆的访问权限。

  1. DMA-BUF heap不支持堆专用标志,所以更容易对外提供统一的接口,利于标准化
  • 对于ION heap来说,会通过专用标志来实现不同的内存分配策略。

如ION 在 SYSTEM_HEAP 上分配内存时,使用ION_HEAP_SYSTEM来分配,而对于是否分配带 cache 的 buffer,则是通过传入 ION_FLAG_CACHED 标志位来实现的。(也就是说可以支持同一个heap中传入vendor私有的heap flags来实现不同的分配方式)

//ION中系统堆中的缓存分配//libioNIOn_alloc_fd(ionfd, size, 0, ION_HEAP_SYSTEM, ION_FLAG_CACHED, &fd)

因为是专用标志,也就是私有化,不同的vendor厂商实现不同不容易统一。

  • 对于 DMA-BUF heap来说,则不支持堆的专用标志。每种不同的分配都是在不同的堆中完成的。

例如,对于在ION中system heap的cached和uncached两种分配方式在DMA-BUF heap中则是会生成两个独立的heap: /dev/dma_heap/system 和 /dev/dma_heap/system_uncached

//DMA-BUF中系统堆中的缓存分配//libdmabufheapallocator->Alloc("system", size)

对于HEAP堆类型的简单说明:

  • CMA HEAP(物理连续 buffer)

  • SYSTEM HEAP(物理非连续 buffer)
    SYSTEM HEAP 默认只支持带 Cached 的 buffer,只有 CPU 需要参与访问的 buffer 才需要带 cached,这样可以加快 CPU 的访问速度,但是在 CPU 和 DMA 设备之间共享内存时,需要来回刷 Cache,这会增加系统开销。

  • SYSTEM-UNCACHED HEAP(应用程序申请不带 cache 的 buffer)
    不带 cached 的 buffer 则通常只用于 DMA 设备之间的 buffer 共享,因此省去了 Cache 同步所带来的额外开销,极大的提高了 DMA 设备访问 buffer 的效率。


参考

dma-buf 由浅入深(八) —— ION 简化版

Buffer Sharing and Synchronization

Camera Buffer Management

dma-heap: Add a system-uncached heap

DMA_HEAP源码

来源地址:https://blog.csdn.net/u011795345/article/details/129306630

--结束END--

本文标题: 201_DMA-BUF简单介绍

本文链接: https://www.lsjlt.com/news/371716.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 201_DMA-BUF简单介绍
    一、DMA-BUF等概念的介绍 首先需要明确DMA-BUF,Dma buffer,ION和DMA-BUF Heap是不同的概念。 在Android 多媒体系统中为了减少因不同进程之间内存的多次拷贝而产生的不必要的开销,最直接的想法是希望跟硬...
    99+
    2023-08-16
    linux android java 缓存
  • Django admin简单介绍
    生成同步数据库的脚本: python manage.py makemigrations 同步数据库: python manage.py migrate 创建后台用户 python manage.py createsuperuser 访...
    99+
    2023-01-31
    简单 Django admin
  • Django ajax 简单介绍
    AJAX Asynchronous Javascript And XML是 "异步Javascript和XML"。即使用 Javascript 语言与服务器进行异步交互,传输的数据为XML。 同步交互:客户端发出一个请求后,需要等待服务器...
    99+
    2023-01-31
    简单 Django ajax
  • C++ OpenMP简单介绍
    目录一、背景知识1、program作用2、C++不同版本区别二、什么是OpenMP三、关键字1、reduction 作用2、default(shared)作用一、背景知识 1、pro...
    99+
    2023-05-20
    c++ OpenMP简介 c++ OpenMP
  • Android Socket 简单介绍
    文章目录 前言一、Socket是什么?百度百科的解释我自己的理解 二、简单示例1.服务端2.客户端3.布局4.实现 参考总结 前言 最近需求需要使用Socket进行通讯,我在工作...
    99+
    2023-09-23
    android
  • 4:GTID简单介绍
    概述: 当使用GTIDs时,可以识别和跟踪每一个事务,因为它是在原始服务器上提交的,并由任何slave应用;简单来说就是master提交的所有事务都在slaves应用一次,两者的数据就能保证一致性,此外,...
    99+
    2022-10-18
  • oracle lob 简单介绍
    何为LOB?lob为oracle数据库的一个大对象数据类型,可以存储超过4000bytes的字符串,二进制数据,OS文件等大对象信息.最大可存储的容量根oracle的版本和oracle 块大小有关.有那几种...
    99+
    2022-10-18
  • 1.AutoMapper简单介绍
    官网:http://automapper.org/ 源码:https://github.com/AutoMapper/AutoMapper NUGET安装: PM> Install-Package AutoMapper Au...
    99+
    2020-08-26
    1.AutoMapper简单介绍
  • 免杀简单介绍
    免杀简单介绍 免杀是什么? ​ 免杀,指的是一种能使病毒木马免于被杀毒软件查杀的技术。 为什么要制作免杀? ​ 当前不论是个人PC还是服务器都有杀软,如个人PCwindows操作系统自带的 W...
    99+
    2023-09-01
    服务器 php 运维
  • python元组简单介绍
    目录1、拆包2、enumerate3、list()元组的特点:是一种不可变序列,一旦创建就不能修改 1、拆包 将元组的元素取出赋值给不同变量 >>> a = ...
    99+
    2022-11-12
  • Java单例模式简单介绍
    一、概念单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,...
    99+
    2023-05-31
    java 单例模式 ava
  • scrapy框架的简单介绍
    这篇文章主要介绍“scrapy框架的简单介绍”,在日常操作中,相信很多人在scrapy框架的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”scrapy框架的简单介绍”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-02
  • MyBatis入门介绍(超简单)
    MyBatis 简介MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。MyBatis是支...
    99+
    2023-05-31
    mybatis 入门 batis
  • EVE-NG简单入门介绍
    此篇文章简单的介绍下模拟器EVE-NG的使用,具体包括Dynamips设备导入与运行,IOL设备的导入与运行,QEMU设备的导入与运行,客户端软件的安装,物理网络与虚拟网络的结合等。一.导入镜像Dynamips是由法国人Chris Fill...
    99+
    2023-06-05
  • PyTorch中的torch.cat简单介绍
    目录1.toych简单介绍2.张量Tensors3.torch.cat1.toych简单介绍 包torch包含了多维疑是的数据结构及基于其上的多种数学操作。 torch包含了多维张量...
    99+
    2022-11-13
  • Android init.rc文件简单介绍
    Android init.rc文件简单介绍 init.rc脚本是由Android中linux的第一个用户级进程init进行解析的。 init.rc 文件并不是普通的配置文件,而...
    99+
    2022-06-06
    init Android
  • oracle sql_trace 简单应用介绍
    SQL_TRACE是Oracle提供的用于进行SQL跟踪的手段,是强有力的辅助诊断工具.在日常的数据库问题诊断和解决中,SQL_TRACE是非常常用的方法。1.通过putty 或其他主机工具进入数据库所在主...
    99+
    2022-10-18
  • python中的json简单介绍
    这篇文章主要讲解了“python中的json简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中的json简单介绍”吧! ...
    99+
    2022-10-18
  • Android中的Adapter简单介绍
    Android中的Adapter在自定义显示列表时非常有用,比如SimpleAdapter,它的构造函数是:  public SimpleAdapter (Context co...
    99+
    2022-06-06
    adapter Android
  • CSS中Sprites的简单介绍
    本篇内容介绍了“CSS中Sprites的简单介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!HTML代码...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作