1. 背景与意义

1.1 异构系统与缓冲区共享的挑战

在现代 SoC、嵌入式、图形和多媒体系统中,CPU、GPU、VPU、ISP、DMA 控制器等多个硬件单元需要高效地共享和传递大块数据(如图像帧、视频流、AI 张量等)。如果每个设备都维护独立的缓冲区,数据在设备间传递时就需要频繁拷贝,极大浪费带宽和内存,降低系统性能。

1.2 dma-buf 的目标

dma-buf 框架是 Linux 内核为解决“跨设备零拷贝缓冲区共享”而设计的通用机制。其核心目标包括:

  • 跨驱动、跨设备共享物理缓冲区,避免冗余拷贝。

  • 标准化缓冲区导出、导入、映射、同步等操作,简化驱动开发。

  • 支持多种内存类型(系统内存、显存、专用区域等),适应复杂硬件架构。

  • 支持同步机制(fence),保证多设备并发访问的数据一致性。

2. dma-buf 的核心原理

2.1 角色划分

  • Exporter(导出者):负责分配和管理物理缓冲区的驱动(如 GPU、VPU、分配器等)。

  • Importer(导入者):需要访问该缓冲区的其他驱动(如显示控制器、ISP、DMA 控制器等)。

  • dma-buf 核心框架:为 exporter 和 importer 提供标准化的缓冲区共享、映射、同步等接口。

2.2 共享机制

  • Exporter 通过 dma_buf_export() 导出一个物理缓冲区,获得一个 struct dma_buf 对象,并为其分配一个匿名文件描述符(fd)。

  • Importer 通过 fd 调用 dma_buf_get() 或 dma_buf_attach(),获得对该缓冲区的访问权。

  • Importer 可通过 dma_buf_map_attachment() 将缓冲区映射到自己的设备地址空间,实现零拷贝访问。

  • 多个 importer 可同时 attach 同一个 dma-buf,实现多设备并发访问。

dma-buf机制建立在 anon_inode之上,是 anon_inode技术一个重要应用示例。

2.3 同步机制

  • dma-buf 支持 fence(同步栅栏)机制,保证多设备并发访问时的数据一致性。

  • Exporter/Importer 可通过 dma_resv 对象管理读写 fence,协调访问时序。

3. 关键数据结构与实现

3.1 struct dma_buf_ops

dma_buf_ops 定义了 dma-buf 的所有操作接口,由 exporter 实现。

struct dma_buf_ops {int (*attach)(struct dma_buf *, struct dma_buf_attachment *);void (*detach)(struct dma_buf *, struct dma_buf_attachment *);int (*pin)(struct dma_buf_attachment *attach);void (*unpin)(struct dma_buf_attachment *attach);struct sg_table *(*map_dma_buf)(struct dma_buf_attachment *, enum dma_data_direction);void (*unmap_dma_buf)(struct dma_buf_attachment *, struct sg_table *, enum dma_data_direction);void (*release)(struct dma_buf *);int (*begin_cpu_access)(struct dma_buf *, enum dma_data_direction);int (*end_cpu_access)(struct dma_buf *, enum dma_data_direction);int (*mmap)(struct dma_buf *, struct vm_area_struct *vma);int (*vmap)(struct dma_buf *dmabuf, struct iosys_map *map);void (*vunmap)(struct dma_buf *dmabuf, struct iosys_map *map);
};
  • attach/detach:设备 attach/detach 缓冲区时的回调。

  • pin/unpin:锁定/解锁缓冲区,防止被移动。

  • map/unmap_dma_buf:将缓冲区映射到设备地址空间。

  • release:最后一个引用释放时的清理回调。

  • begin/end_cpu_access:CPU 访问前后的同步操作(如 cache flush)。

  • mmap/vmap/vunmap:内核/用户空间映射支持。

3.2 struct dma_buf

dma_buf 是 dma-buf 的核心对象,描述一个可共享的物理缓冲区。

struct dma_buf {size_t size;struct file *file;struct list_head attachments;const struct dma_buf_ops *ops;unsigned vmapping_counter;struct iosys_map vmap_ptr;const char *exp_name;const char *name;spinlock_t name_lock;struct module *owner;struct list_head list_node;void *priv;struct dma_resv *resv;wait_queue_head_t poll;struct dma_buf_poll_cb_t cb_in, cb_out;// ... 其他成员
};
  • size:缓冲区大小。

  • file:匿名文件,用于 fd 传递和引用计数。

  • attachments:所有 attach 到该缓冲区的设备链表。

  • ops:操作函数集。

  • resv:同步对象,管理 fence。

  • poll/cb_in/cb_out:支持用户空间 poll/epoll 事件通知。

3.3 struct dma_buf_attachment

描述一个设备与 dma-buf 的关联关系。

struct dma_buf_attachment {struct dma_buf *dmabuf;struct device *dev;struct list_head node;bool peer2peer;const struct dma_buf_attach_ops *importer_ops;void *importer_priv;void *priv;
};
  • dmabuf:关联的 dma-buf。

  • dev:关联的设备。

  • priv:exporter/importer 的私有数据。

3.4 struct dma_buf_export_info

导出 dma-buf 时的参数描述。

struct dma_buf_export_info {const char *exp_name;struct module *owner;const struct dma_buf_ops *ops;size_t size;int flags;struct dma_resv *resv;void *priv;
};

4. 主要 API 及用法

4.1 Exporter 侧

4.1.1 导出缓冲区
DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
exp_info.ops = &my_dma_buf_ops;
exp_info.size = buffer_size;
exp_info.priv = my_priv_data;
struct dma_buf *dmabuf = dma_buf_export(&exp_info);
4.1.2 获取 fd
int fd = dma_buf_fd(dmabuf, O_CLOEXEC);
4.1.3 释放缓冲区
dma_buf_put(dmabuf);

4.2 Importer 侧

4.2.1 通过 fd 获取 dma-buf
struct dma_buf *dmabuf = dma_buf_get(fd);
4.2.2 设备 attach
struct dma_buf_attachment *attach = dma_buf_attach(dmabuf, dev);
4.2.3 映射到设备地址空间
struct sg_table *sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
4.2.4 解除映射与 detach
dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
dma_buf_detach(dmabuf, attach);
4.2.5 释放 dma-buf
dma_buf_put(dmabuf);

4.3 CPU 访问同步

dma_buf_begin_cpu_access(dmabuf, DMA_FROM_DEVICE);
// CPU 访问缓冲区
dma_buf_end_cpu_access(dmabuf, DMA_FROM_DEVICE);

4.4 用户空间 mmap

mmap(fd, ...); // 通过 fd 直接 mmap 到用户空间

5. dma-buf 的同步机制

5.1 dma_resv 与 fence

  • dma-buf 通过 struct dma_resv 管理同步 fence,协调多设备并发访问。

  • Exporter/Importer 在读写缓冲区前后添加/等待 fence,保证数据一致性。

  • 支持隐式同步(如 GPU/显示管线)和显式同步(如用户空间 fence)。

5.2 begin_cpu_access/end_cpu_access

  • 在 CPU 访问前后,需调用 begin_cpu_access/end_cpu_access,由 exporter 实现 cache flush、内存屏障等操作,保证数据一致性。

6. dma-buf 的典型应用场景

6.1 GPU-显示管线零拷贝

  • GPU 渲染输出帧缓冲区,通过 dma-buf fd 传递给显示控制器(DRM/KMS),实现零拷贝显示。

6.2 摄像头-ISP-GPU 协作

  • 摄像头驱动分配帧缓冲区,ISP 处理后通过 dma-buf fd 传递给 GPU 进行后处理或 AI 推理。

6.3 多媒体编解码

  • VPU 解码器输出缓冲区,通过 dma-buf fd 传递给 GPU/显示/AI 单元,实现高效视频播放和处理。

6.4 用户空间跨进程共享

  • 用户空间应用通过 dma-buf fd 在不同进程间共享大块数据(如图像、视频帧、AI 张量等)。

7. dma-buf 的内核实现细节

7.1 文件描述符与引用计数

  • 每个 dma-buf 对象都对应一个匿名文件(anon_inode),通过 fd 传递和引用计数。anon_inode技术参见博文:Linux 内核 anon_inode 机制详解与应用。

  • 内核通过 get_dma_buf/dma_buf_put 管理生命周期。

7.2 设备 attach/detach

  • 每个 importer attach 时,exporter 可检查设备兼容性、DMA 约束等,拒绝不支持的设备。

  • detach 时清理相关资源。

7.3 映射与同步

  • map/unmap_dma_buf 负责将缓冲区映射到 importer 设备地址空间,支持多种内存类型和 DMA 方向。

  • begin/end_cpu_access 负责 cache flush、内存屏障等同步操作。

7.4 poll/epoll 支持

  • dma-buf 支持 poll/epoll 机制,用户空间可通过 poll/epoll 监控缓冲区 fence 状态,实现异步事件通知。

8. 总结

  • dma-buf 是 Linux 内核支持异构系统、跨设备零拷贝缓冲区共享的核心机制。

  • 通过标准化的导出、导入、映射、同步等接口,极大简化了驱动开发和系统集成。

  • 支持多种内存类型、同步机制和异步事件通知,适应复杂硬件和高性能场景。

  • 正确实现和使用 dma-buf 能显著提升系统性能、带宽利用率和开发效率。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Scikit-learn Python机器学习 - 分类算法 - 朴素贝叶斯

锋哥原创的Scikit-learn Python机器学习视频教程: https://www.bilibili.com/video/BV11reUzEEPH 课程介绍 ​ 本课程主要讲解基于Scikit-learn的Python机器学习知识,包括机器学习概述,特征工程(数据集,特征抽取,特…

如何免费股票数据API(第13期):沪深A股《最新分时交易》数据获取大全:附Python、Java等多语言实战教程与接口文档说明

在金融科技迅猛发展的今天,股票量化分析以其严谨的科学性和强大的系统性,正日益成为投资领域的主流方法论。任何卓越的量化模型的诞生,都离不开全面、精准、及时的数据支撑。无论是跃动着的实时交易数据、沉淀了历史规律的K线走势&#xff0c…

国标GB28181视频EasyGBS视频监控平台:一网联全城,交通道路可视化、视频巡检、应急指挥“三合一”。

一、方案背景​人车暴涨,路口告急:高峰堵、事故慢、取证难,老办法已拖不动城市交通。破局之道,先看摄像头——EasyGBS 严格遵循 GB28181 国标,一站式完成直播、存储、检索、转码,把万千路口秒级搬上云端&am…

单元测试(白盒测试方法)

一、单元测试1.单元测试是对软件的基本组成单元进行的测试,如函数、类或类的方法。单元测试是对软件的最小可测试单元(即可独立编译或汇编的程序模块)进行的测试活动,也称为模块测试二、白盒测试方法实例代码public static int te…

2010-2022 同等学力申硕国考:软件工程简答题真题汇总

2010年简答题 给出数据流图的定义,并举例说明数据流图的四个基本构成成份。 数据流图(Data Flow Diagram, DFD)是一种用于描述系统中数据流动和处理过程的图形工具。它通过直观的方式展示了系统的输入数据如何经过一系列处理变换为输出数据&a…

海外盲盒APP开发:如何用技术重构“惊喜经济”

当盲盒的神秘感遇上技术的确定性,一场关于消费体验的革命正在海外市场悄然发生。从概率算法的公平性到AR虚拟开箱的沉浸感,从跨境物流的实时追踪到多语言支持的无缝切换,海外盲盒APP的开发是一场技术、设计与商业逻辑的深度融合。概率算法&am…

Aosp13 手机sim卡信号格显示修改

工作中,客户要求对信号格显示偏弱不够友好为由,提出修改,要求使其显示信号强一些。在此记录 一问题:修改系统sim卡显示的信号格,在设备其他配置不变的情况下,使其信号格显示比原有的要优秀二 …

硬件开发2-汇编2(ARMv7-A)- 裸机开发

一、指令1、b&#xff08;Branch&#xff09;原型&#xff1a;B<c> <label>作用&#xff1a;实现无条件跳转&#xff0c;常用于不返回的跳转场景特点&#xff1a;仅跳转到目标地址&#xff0c;不保存返回地址示例&#xff1a;b reset ;跳转到reset标号处执…

清源 SCA 社区版更新(V4.2.0)|漏洞前置感知、精准修复、合规清晰,筑牢软件供应链安全防线!

随着数字化进程加速&#xff0c;软件供应链安全威胁日益复杂&#xff0c;公开漏洞响应滞后、0day 攻击防不胜防、组件升级编译失败、安全与合规风险混杂......这些痛点让企业安全团队、运维人员及研发团队疲于应对。自 2025 年 7 月 1 日安势清源 SCA 社区版首次正式发布以及在…

氚燃料增殖里程碑:MIT新型BABY包层技术实验验证

● 导语 5月20日&#xff0c;麻省理工学院&#xff08;MIT&#xff09;发文称&#xff0c;BABY实验首次获取了氚在装置内增殖的实测数据&#xff0c;验证了核心模型&#xff0c;并为未来核聚变电厂的燃料自循环奠定了重要基础。 原文&#x1f447;&#x1f3fb; https://m…

python+springboot+uniapp微信小程序题库系统 在线答题 题目分类 错题本管理 学习记录查询系统

目录技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xff0…

Office转PDF转换器v1.0.py

软件介绍 这是批量将word、Excel、PPT转换为PDF格式的软件&#xff0c;不过PPT转换为PDF需要电脑安装了office&#xff0c;目前这个我还没有解决没有office也可以安装的方法。 软件使用 软件使用是比较简单的&#xff0c;导入文件/文件夹&#xff0c;在自定义输出路径 点击这…

62_基于深度学习的海洋垃圾检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)

目录 项目介绍&#x1f3af; 功能展示&#x1f31f; 一、环境安装&#x1f386; 环境配置说明&#x1f4d8; 安装指南说明&#x1f3a5; 环境安装教学视频 &#x1f31f; 二、数据集介绍&#x1f31f; 三、系统环境&#xff08;框架/依赖库&#xff09;说明&#x1f9f1; 系统环…

深入浅出 全面剖析消息队列(Kafka,RabbitMQ,RocketMQ 等)

消息队列 一、概念 消息队列&#xff08;MQ&#xff09;&#xff1a;一种异步通信机制&#xff0c;通过“消息”的形式让不同系统或模块解耦核心思想&#xff1a;发送方&#xff08;生产者Producer&#xff09;只负责发送消息&#xff0c;接收方&#xff08;消费者Consumer&…

Flux Images Generation API 对接说明

本文将介绍一种 Flux Images Generation API 对接说明&#xff0c;它是可以通过输入自定义参数来生成Flux官方的图片。 接下来介绍下 Flux Images Generation API 的对接说明。 申请流程 要使用 API&#xff0c;需要先到 Flux Images Generation API 对应页面申请对应的服务…

CSS布局 - 网格布局 -- 笔记3

目录网格布局基础网格网格剖析CSS 提供了一些控制网页布局的几个重要工具&#xff0c;这里介绍网格布局。 网格布局 CSS 网格可以定义由行和列组成的二维布局&#xff0c;然后将元素放置到网格中。有些元素可能只占据网格的一个单元&#xff0c;另一些元素则可能占据多行或多…

合约开发完后部署测试

一 编译npx hardhat compile二 测试npx hardhat test三部署注意部署的时候2.0和3版本有所区别&#xff0c;3.0如下# 部署到本地网络&#xff08;如已运行 npx hardhat node&#xff09; npx hardhat ignition deploy ./ignition/modules/MyModule.ts --network localhost# 部署…

产品无法正确解析复杂表格和流程图,有什么替代方案或优化方法?

在真实办公场景中&#xff0c;文档内的元素往往不具备标准化和格式化特征&#xff0c;像双栏表格、无线图表等复杂元素十分常见。而传统 OCR 工具在面对这类复杂文档时&#xff0c;存在明显的能力短板&#xff1a;它无法准确判断复杂表格的结构逻辑以及内容的顺序逻辑&#xff…

《Html模板》HTML数学题目生成器 - 让数学练习更简单(附源码)

目录专栏导读&#x1f9ee; HTML数学题目生成器 - 让数学练习更简单项目简介✨ 核心功能&#x1f3af; 灵活的运算类型选择&#x1f4ca; 智能题目生成算法⚙️ 个性化参数设置&#x1f5a8;️ 专业打印优化&#x1f3a8; 用户体验设计现代化界面交互体验&#x1f6e0;️ 技术实…

Go语言设计模式(七)组合模式

组合模式是指将一组相似对象当做一个单一对象的设计模式.1.组成角色:1.1组件:组合中的对象声明接口,主要用于访问和管理其子组件.1.2叶子节点:定义组合中原始对象行为的类.叶子节点表示组合中的叶对象.1.3组合:又称为容器,存储子组件并在组件接口中实现与子组件有关的类.1.4客户…