外設數據到昇騰310推理卡 之二dma_alloc_attrs

目錄

內核源碼及路徑

CONFIG_DMA_DECLARE_COHERENT

DTS示例配置

dma_direct_alloc

特殊屬性快速路徑 (DMA_ATTR_NO_KERNEL_MAPPING)

主體流程

1. 內存分配核心

2. 地址轉換

3. 緩存一致性處理

?映射

attrs不同屬性的cache處理

?cache的標示(ARM64)

dma_alloc_attrs

總結


? ?前述文章中,我們介紹了分配內存的幾種方式以及著重介紹mmap方式的一個參數,本文介紹分配內存的過程。

內核源碼及路徑

路徑函數及宏? 功能
kernel\dma\mapping.cdma_alloc_attrs
kernel\kernel\dma\coherent.c

dma_declare_coherent_memory

dma_alloc_from_dev_coherent? DMA設備一致性內存分配

\kernel\kernel\dma\direct.cdma_direct_alloc? DMA CMA內存分配
\kernel\include\linux\dma-mapping.hdma_alloc_coherent
? arch\arm64\mm? ?
?
arch_dma_prep_coherent 分配內存頁后,將內存頁轉換虛擬地址并調用__dma_flush_area
\kernel\arch\arm64\mm\cache.S__dma_flush_area 功能clean & invalidate D / U line
I:\rk3588\kernel\arch\arm64\include\asm\pgtable.hpgprot_syscached 功能Mark the prot value as outer cacheable and inner non-cacheable

??

CONFIG_DMA_DECLARE_COHERENT

聲明設備默認支持硬件一致性DMA(Hardware-Coherent DMA),使得內核在分配DMA緩沖區時,自動假設設備與CPU緩存保持一致,無需軟件維護同步。

場景啟用?CONFIG_DMA_DECLARE_COHERENT不啟用
內存分配dma_alloc_coherent()?返回硬件一致性內存默認返回非一致性內存(需手動同步)
同步操作無需調用?dma_sync_*必須顯式同步緩存
設備樹/ACPI配置需設備節點包含?dma-coherent?屬性無特殊要求
性能更高(無同步開銷)較低(依賴軟件同步

如何驗證硬件是否真正支持一致性?

  • 檢查設備手冊是否聲明支持(如ARM的ACP或PCIe的ATS)。在驅動中故意省略dma_sync_*,測試數據傳輸是否正常。

DTS示例配置

reserved-memory {#address-cells = <1>;#size-cells = <1>;ranges;my_coherent_pool: coherent_pool@0x10000000 {compatible = "shared-dma-pool";reg = <0x10000000 0x400000>; // 4MB區域no-map;};
};my_device: my_device@0 {compatible = "vendor,coherent-device";memory-region = <&my_coherent_pool>; // 關聯內存區域dma-coherent;
};

基于上述的DTS與內核配置,在分配一致性內存時,從上述DTS中的區域分配,而非從cma分配。例如我們可以將高地址內存預留出來,通過上述方式給我們的視頻接口使用。

此外可以在驅動中調用接口?dma_declare_coherent_memory將保留的物理內存與設備關聯。進而繞開cma

dma_direct_alloc

特殊屬性快速路徑 (DMA_ATTR_NO_KERNEL_MAPPING)

if ((attrs & DMA_ATTR_NO_KERNEL_MAPPING) && !force_dma_unencrypted(dev)) {page = __dma_direct_alloc_pages(dev, size, gfp & ~__GFP_ZERO);*dma_handle = phys_to_dma_direct(dev, page_to_phys(page));return page; // 返回 page 結構而非虛擬地址
}

應用場景:當內核不需要訪問該內存時(如純設備間DMA)

主體流程

?

1. 內存分配核心

page = __dma_direct_alloc_pages(dev, size, gfp & ~__GFP_ZERO);

  • 使用 CMA 或 buddy 分配器獲取物理連續頁

  • 明確排除?__GFP_ZERO?以優化性能(后續手動清零)

2. 地址轉換

*dma_handle = phys_to_dma_direct(dev, page_to_phys(page));
  • 將物理地址轉換為設備可識別的 DMA 地址

  • 處理可能的地址偏移(如 SMMU 前向窗口)

3. 緩存一致性處理

arch_dma_prep_coherent(page, size);
  • 確保 CPU 緩存與內存一致。這里是在分配內存后,被使用前,進行的一致性處理。架構特定實現(如 ARM 的 cache 刷寫)

?映射

主要屬性控制,如上一篇所述

attrs不同屬性的cache處理

/** Return the page attributes used for mapping dma_alloc_* memory, either in* kernel space if remapping is needed, or to userspace through dma_mmap_*.*/
pgprot_t dma_pgprot(struct device *dev, pgprot_t prot, unsigned long attrs)
{if (force_dma_unencrypted(dev))prot = pgprot_decrypted(prot);if (dev_is_dma_coherent(dev))return prot;
#ifdef CONFIG_ARCH_HAS_DMA_WRITE_COMBINEif (attrs & DMA_ATTR_WRITE_COMBINE)return pgprot_writecombine(prot);
#endifif (attrs & DMA_ATTR_SYS_CACHE_ONLY ||attrs & DMA_ATTR_SYS_CACHE_ONLY_NWA)return pgprot_syscached(prot);return pgprot_dmacoherent(prot);
}#define pgprot_dmacoherent(prot)	pgprot_noncached(prot)  //關閉cache

?

?cache的標示(ARM64)

/*
?* Mark the prot value as outer cacheable and inner non-cacheable. Non-coherent
?* devices on a system with support for a system or last level cache use these
?* attributes to cache allocations in the system cache.
?*/


#define pgprot_syscached(prot) \__pgprot_modify(prot, PTE_ATTRINDX_MASK, \PTE_ATTRINDX(MT_NORMAL_iNC_oWB) | PTE_PXN | PTE_UXN)

?

dma_alloc_attrs

? ? ?內核分配并映射內存的流程分為三個主體,本篇介紹了左邊兩個。至于smmu iommu的映射目前不涉及。?

? ? ?順便提一句?dma_alloc_coherent,因為很多教程里面都提這個接口,這個接口內部實際封裝了attrs這個接口,而僅僅把attrs屬性設置了0,根據上述的分析,即映射到內核時,其頁面被設置了no cache的屬性,即關閉了cache。

static inline void *dma_alloc_coherent(struct device *dev, size_t size,dma_addr_t *dma_handle, gfp_t gfp)
{return dma_alloc_attrs(dev, size, dma_handle, gfp,(gfp & __GFP_NOWARN) ? DMA_ATTR_NO_WARN : 0);
}

總結

? ? 分析了dma 分配的流程,分為三種情況。

? ? 1) dma 設備支持一致性,從設備占用的DDR中分配內存,不走cma的接口。

? ? ?2) 直接進行物理地址的映射。

? ? ?3) iommu的情況。??dma_map_ops的實現

? ? 通過上述流程可知,dma分配的接口可以分配cache的和no cached,具體哪些驅動采用了cached呢?

? ? ?另外既然如此,流式映射的接口,諸如dma_map_single為什么不用dma_alloc_attrs 封裝呢?

因為dma_map_single為單純建立映射,并不分配內存;而dma_alloc_attrs先分配了頁啊。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88507.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88507.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88507.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 大視界:基于 Java 的大數據可視化在智慧城市能源消耗動態監測與優化決策中的應用(2025 實戰全景)

??摘要??在“雙碳”戰略深化落地的 2025 年&#xff0c;城市能源管理面臨 ??實時性??、??復雜性??、??可決策性?? 三重挑戰。本文提出基于 Java 技術棧的智慧能源管理平臺&#xff0c;融合 ??Flink 流處理引擎??、??Elasticsearch 實時檢索??、??ECh…

微信小程序控制空調之微信小程序篇

目錄 前言 下載微信開發者工具 一、項目簡述 核心功能 技術亮點 二、MQTT協議實現詳解 1. MQTT連接流程 2. 協議包結構實現 CONNECT包構建 PUBLISH包構建 三、核心功能實現 1. 智能重連機制 2. 溫度控制邏輯 3. 模式控制實現 四、調試系統實現 1. 調試信息收集…

spring boot 詳解以及原理

Spring Boot 是 Spring 框架的擴展&#xff0c;旨在簡化 Spring 應用的開發和部署。它通過自動配置和約定優于配置的原則&#xff0c;讓開發者能夠快速搭建獨立運行的、生產級別的 Spring 應用。以下是 Spring Boot 的詳細解析和工作原理&#xff1a; 一、Spring Boot 的核心特…

3.4 ASPICE的系統架構與設計過程

ASPICE&#xff08;Automotive SPICE&#xff09;在系統架構與設計過程中&#xff0c;強調了在汽車軟件開發中確保系統穩定性、可靠性和安全性的重要性。以下是ASPICE在系統架構與設計過程中的主要內容和步驟&#xff1a;系統架構設計準備階段&#xff1a;需求分析&#xff1a;…

自助KTV選址指南與優化策略

選址四大鐵律&#xff08;硬性條件&#xff09;產權合規&#xff1a;純商業產權消防雙通道&#xff1a;必須通過消防驗收遠離敏感區&#xff1a;距居民區、學校、醫院等200米以上面積達標&#xff1a;滿足包廂規劃需求選址核心邏輯&#xff08;優先級排序&#xff09;要素關鍵策…

深度學習11(調參設參+批標準化)

調參技巧對于調參&#xff0c;通常采用跟機器學習中介紹的網格搜索一致&#xff0c;讓所有參數的可能組合在一起&#xff0c;得到N組結果。然后去測試每一組的效果去選擇。 假設我們現在有兩個參數 α&#xff1a;0.1, 0.01, 0.001β&#xff1a;0.8, 0.88. 0.9這樣會有9種…

Python 中 enumerate(s) 和 range() 的對比

一、enumerate(s) 是什么&#xff1f;for i, c in enumerate(s):...enumerate(s) 是一個內置函數&#xff0c;用于在遍歷可迭代對象時&#xff0c;同時獲得元素的索引和值。它返回的是一個**(index, element)** 元組。常用于遍歷字符串、列表、元組等時&#xff0c;如果你既想拿…

【一起來學AI大模型】RAG系統流程:查詢→向量化→檢索→生成

RAG&#xff08;Retrieval-Augmented Generation&#xff09;系統核心流程非常精準&#xff1a; 查詢 → 向量化 → 檢索 → 生成 這是 RAG 實現“知識增強”的關鍵路徑。下面我們結合具體組件&#xff08;如 ChromaDB、LangChain 檢索器&#xff09;詳細拆解每個步驟&#xff…

圖像硬解碼和軟解碼

一、什么是圖像解碼&#xff1f; 圖像解碼是指將壓縮編碼&#xff08;如 JPEG、PNG、WebP、H.264/AVC、H.265/HEVC 等格式&#xff09;的圖像或視頻數據還原為原始像素數據&#xff08;如 RGB、YUV&#xff09;的過程。 解碼可以在CPU&#xff08;軟件解碼&#xff09;或專用硬…

Camera2API筆記

1. 常用對象CameraManager 相機服務。用于獲取相機對象和相機信息。CameraDevices 相機設備。負責連接相機、創建會話、生成拍攝請求&#xff0c;管理相機生命周期。CameraCaptureSession 相機拍攝會話。用于預覽和拍攝。一個相機只能有一個活躍會話。打開新會話時&#xff0c;…

觸控屏gt1947

比較器判斷是否翻轉&#xff0c;周期控制器負責控制周期&#xff08;period&#xff09;。sample采器有多個影子&#xff0c;每次采樣查看是否到了翻轉的時候。

DNS和ICMP

域名介紹在網絡通信中&#xff0c;需要用到ip加port&#xff0c;但是ip并不方便記憶&#xff0c;于是我們常用域名來對應一個ip例如&#xff1a;www.baidu.com 對應 156.36.56.98&#xff08;隨便寫的&#xff09;com: 一級域名. 表示這是一個企業域名. 同級的還有 "…

2022 年 12 月青少年軟編等考 C 語言六級真題解析

目錄 T1. 電話號碼T2. 區間合并T3. 撲克牌排序T4. 現代藝術思路分析T1. 電話號碼 題目鏈接:SOJ D1137 此題為 2021 年 12 月六級第一題原題,見 2021 年 12 月青少年軟編等考 C 語言六級真題解析中的 T1。 T2. 區間合并 題目鏈接:SOJ D1112 此題為 2021 年 9 月六級第三…

無鎖隊列:從零構建生產者-消費者數據結構

高性能無鎖隊列&#xff1a;從零構建生產者-消費者數據結構 問題的本質 生產者-消費者問題的核心挑戰不在于數據傳輸&#xff0c;而在于協調。傳統的鎖機制雖然簡單&#xff0c;但帶來了三個致命問題&#xff1a; 性能瓶頸&#xff1a;線程阻塞和上下文切換優先級反轉&#xff…

JAVA面試寶典 -《Spring IOC核心:Bean生命周期全解析》

文章目錄&#x1f331; 《Spring IOC核心&#xff1a;Bean生命周期全解析》1?? 引言&#xff1a;Bean 生命周期為什么重要&#xff1f;2?? Bean 生命周期概覽&#xff08;圖示 簡要說明&#xff09;3?? 每一步詳細解析&#xff08;源碼理解 示例&#xff09;3.1 &#…

Python 類型注解實戰:`Optional` 與安全數據處理的藝術

Python 類型注解實戰&#xff1a;Optional 與安全數據處理的藝術 在 Python 開發中&#xff0c;類型注解&#xff08;Type Hints&#xff09;已經成為現代 Python 項目的標配。本文將通過一個真實的認證令牌獲取函數 get_auth_token()&#xff0c;深入解析 Optional 類型的應用…

深入MyBatis:CRUD操作與高級查詢實戰

引言 在上一篇文章中&#xff0c;我們介紹了Mybatis的基礎使用。 如有需要請移步查看&#xff1a; MyBatis入門&#xff1a;快速掌握用戶查詢實戰https://blog.csdn.net/qq_52331401/article/details/149270402?spm1001.2014.3001.5502 今天&#xff0c;我將通過一個完整的…

Flink DataStream API詳解(二)

一、引言 咱兩書接上回&#xff0c;上一篇文章主要介紹了DataStream API一些基本的使用&#xff0c;主要是針對單數據流的場景下&#xff0c;但是在實際的流處理場景中&#xff0c;常常需要對多個數據流進行合并、拆分等操作&#xff0c;以滿足復雜的業務需求。Flink 的 DataS…

Unity3D游戲線上崩潰排查指南

前言 排查Unity3D線上游戲崩潰是個系統工程&#xff0c;需要結合工具鏈、日志分析和版本管理。以下是詳細的排查指南和關鍵步驟&#xff1a; 對惹&#xff0c;這里有一個游戲開發交流小組&#xff0c;希望大家可以點擊進來一起交流一下開發經驗呀&#xff01; 一、崩潰信息收…

DPDK性能優化實踐:系統級性能調優的方法論與實戰(一套通用的方法論)

性能優化的挑戰與現實困境 在高性能網絡處理領域&#xff0c;性能優化往往被視為一門“玄學”而非科學。許多開發者在面對性能瓶頸時&#xff0c;要么盲目追求單一指標的極致優化&#xff0c;要么采用"試錯法"進行零散的局部調優&#xff0c;結果往往是投入大量精力卻…