201_DMA-BUF简单简介

news2024/9/22 9:47:10

一、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.h
common/include/uapi/linux/dma-heap.h
common/driver/dma-buf/dma-heap.c            //或/msm-kernel/drivers/dma-buf/dma-heap.c
common/drivers/dma-buf/heaps/system_heap.c
common/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/<heap_name> 的字符设备,因此可以通过 sepolicy 单独控制对每个堆的访问权限。

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

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

//ION中系统堆中的缓存分配
//libion
ion_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中系统堆中的缓存分配
//libdmabufheap
allocator->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源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

离线安装samba与配置(.tar方式安装)

一、samba离线安装【安装并设置成功后&#xff0c;相关文件及其位置&#xff1a;①smbd&#xff1a;/usr/local/samba/sbin/smbd②nmdb&#xff1a;/usr/local/samba/sbin/nmbd③配置文件 smb.conf&#xff1a;/usr/local/samba/lib/smb.conf④添加用户的 smbpasswd 文件&#…

Java并发简介(什么是并发)

文章目录并发概念并发和并行同步和异步阻塞和非阻塞进程和线程竞态条件和临界区管程并发的特点提升资源利用率程序响应更快并发的问题安全性问题缓存导致的可见性问题线程切换带来的原子性问题编译优化带来的有序性问题保证并发安全的思路互斥同步&#xff08;阻塞同步&#xf…

Delphi 中 FireDAC 数据库连接(处理错误)

参见&#xff1a;Delphi 中 FireDAC 数据库连接&#xff08;总览&#xff09;本主题描述了如何用FireDAC处理数据库错误。一、概述EFDDBEngineException类是所有DBMS异常的基类。单个异常对象是一个数据库错误的集合&#xff0c;可以通过EFDDBEngineException.Errors[]属性访问…

第十届蓝桥杯省赛——6旋转(二维数组,找规律)

题目&#xff1a;试题 F: 旋转时间限制: 1.0s 内存限制: 512.0MB 本题总分&#xff1a;15 分【问题描述】图片旋转是对图片最简单的处理方式之一&#xff0c;在本题中&#xff0c;你需要对图片顺时针旋转 90 度。我们用一个 n m 的二维数组来表示一个图片&#xff0c;例如下面…

什么是项目管理资格认证

项目管理资格认证是项目管理协会(PMI)在全球范围内推出的针对项目经理的资格认证体系&#xff0c;包括项目管理专业人士&#xff08;PMP&#xff09;认证、PMI敏捷管理专业人士(PMI-ACP)认证、PMI商业分析专业人士&#xff08;PMI-PBA&#xff09;认证、项目集管理专业人士&…

驱动器,DRV10975ZRHFR原理图DRV83055QPHPRQ1规格参数

DRV10975器件是一款具有集成功率MOSFET的三相无传感器电机驱动器&#xff0c;可提供高达1.5A的持续驱动电流。该器件专为成本敏感型、低噪声、低外部组件数量应用而设计。DRV10975&#xff08;明佳达电子&#xff09;DRV10975ZRHFR IC MTR DRV MULTPHS 6.5-18V 24QFN电机类型 -…

拿下3个大厂offer的软件测试面试宝典,面试一文搞定

我是谁、工作几年、你上家公司做什么、负责什么、你的优势、为什么适合这个职位、我想做什么、在这个职位上想得到什么 【呕心沥血】耗时7天整理的金三银四必看的软件测试频面试题 涵盖 接口自动化测试框架面试题_哔哩哔哩_bilibili【呕心沥血】耗时7天整理的金三银四必看的软…

day26 员工薪水中位数

569. 员工薪水中位数 写一个SQL查询&#xff0c;找出每个公司的工资中位数。 以 任意顺序 返回结果表。 查询结果格式如下所示。 SQL&#xff1a;方法一 select id, company, salary from (selectid, company, salary,row_number() over(partition by company order by s…

aws batch 理解batch中的任务调度策略

参考资料 https://docs.amazonaws.cn/en_us/batch/latest/userguide/job_queue_parameters.html#job_queue_scheduling_policy https://docs.amazonaws.cn/en_us/batch/latest/userguide/scheduling-policies.html https://catalog.us-east-1.prod.workshops.aws/workshops/c…

【Python实战】快看:”又中奖了,中大奖了“周围的小伙伴都惊呆了~你还不麻溜滴~(代码版彩票小游戏上线啦)

导语 哈喽&#xff01;北鼻们&#xff0c;晚上好。 夕阳&#x1f307;的第一缕阳光送给小可爱们~每天都要加油鸭&#xff01; 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 彩票是一个恒古不…

206页16万字城市运行“一网统管”体系建设项目需求报告

本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 第 一 章 应用场景示例 一.1 一卡通人员管理针对企业厂区、办公楼等场所人员出入频繁、安保问题多样化、管理环节复杂等现状&#…

文科生比不过理科生,转码IT互联网将成趋势?

今天看到“文科生转码或成趋势”的话题&#xff0c;觉得还是非常有意思哈&#xff0c;所以来聊聊看~ 值得一提的是&#xff0c;虽然现在高中考试改制后&#xff0c;已不再区分文理科生&#xff08;理化生史地政6选3&#xff09;&#xff0c;但是大学本科及研究生以上&#xff…

最小基因变化

基因序列可以表示为一条由 8 个字符组成的字符串&#xff0c;其中每个字符都是 A、C、G 和 T 之一。 假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。 例如&#xff0c;"AACCGGTT" -->…

设计模式-工作线程 创建多少线程池合适

1、定义 让有限的工作线程(Worker Thread)来轮流异步处理无限多的任务。也可以将其归类为分工模式&#xff0c;它的典型实现就是线程池&#xff0c;也体现了经典设计模式中的享元模式&#xff08;重用对象&#xff09;。 例如&#xff0c;海底捞的服务员(线程)&#xff0c;轮流…

“数字档案室测评”相关参考依据梳理

数字档案室建设无疑比数字档案馆建设应用范围更为广泛&#xff0c;涉及的单位类型和专业领域也更多。这一点从国家档案局的机构设置上也可以看出端倪&#xff1a; 国家档案局两个内设业务指导司中&#xff0c;档案馆(室)业务指导司主要针对档案馆和机关档案室&#xff0c;而经济…

【Linux】磁盘结构、文件系统、软硬链接、动静态库链接

文章目录1、磁盘结构1.1 磁盘的物理结构1.2 磁盘的存储结构1.3 磁盘的逻辑结构2、文件系统2.1 4KB加载到内存2.2 文件系统结构3、软硬链接3.1 软链接3.2 硬链接4、动静态库4.1 什么是库&#xff1f;4.2 静态库和静态库链接4.3 动态库和动态库链接4.4 动静态库的加载下面了解到&…

python GUI图形化编程-----wxpython

一、python gui&#xff08;图形化&#xff09;模块介绍&#xff1a; Tkinter :是python最简单的图形化模块&#xff0c;总共只有14种组建 Pyqt :是python最复杂也是使用最广泛的图形化 Wx :是python当中居中的一个图形化&#xff0c;学习结构很清晰 Pywin :是pyth…

Qt界面美化之自定义qss样式表

原生的QT界面不好看&#xff0c;有时候需要根据美工的设计图修改样式。如果使用QML的话搞界面是快&#xff0c;但是QML有点儿吃内存&#xff0c;有时简单的功能还是用传统c的widget方便些。好在有qss&#xff0c;传统界面也可以美化的。QSS称为Qt Style Sheets也就是Qt样式表&a…

项目设计模式和规范

1、责任链模式 自己的理解:避免发生方与接收方解耦 优点:①降低发送方与接收方的耦合 ②简化他们对象 ③方便扩展新增 处理者 缺点:①不方便排错 ②性能问题,且使用不当容易搞出死循环 应用场景:拦截器 Interceptor和过滤器 filter:符合模式的进行拦截或者过滤到,然…

华为云服务器安全注意事项

使用华为云服务器搭建集群的时候不能像我们平时使用虚拟机克隆那样随意&#xff08;我指的是后期使用&#xff09;&#xff0c;要留意安全问题&#xff0c;防止被病毒攻击 注意事项&#xff1a; 1.root用户和创建的普通用户密码要设置复杂一些&#xff0c;不能123456或者00000…