Linux dma-buf 框架原理、實現與應用詳解

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客戶…