在《深入理解Linux核心》中的第545頁介紹了DMA的相關操作。說道DMA,那就不得不提到Cache(高速緩存)的問題。書中引用瞭如下一段範例來描述了Cache一致性問題:
逗弄假設裝置驅動程式把一些資料填入記憶體緩衝區中,然後立刻命令硬體裝置利用DMA傳送方式讀取該資料。如果DMA存取這些實體RAM記憶體單元,而對應的硬體快取行的內容還沒有寫入RAM中,那麼硬體設備所讀取的至就是記憶體緩衝區中的舊值。地
現在有兩種方法來處理DMA緩衝區:
一致性DMA映射:
書上講的比較抽象,通俗地所就是任何對DMA緩衝區的改寫都會直接更新到記憶體中,也稱之為逗同步的地或逗弄一致的地。
串流DMA映射:
根據個人的理解,這裡的流即輸入輸出流,我們需要事先指定DMA緩衝區的方向,例如是地讀緩衝區地還是逗寫緩衝區地。也稱之為逗異步的地或逗出非一致性的地,詳細的內容請看下文。
由於x86體系結構中,硬體設備驅動程式本身會逗窺探地所存取的硬體告訴緩存,因此x86體系結構中不存在DMA一致性問題。而對於其他一些架構如MIPS,SPARC以及POWERPC(包括ARM在內)則需要在軟體上確保其DMA一致性。
對於以上兩者如何選擇,書中有一個合適的建議,如果CPU和DMA處理器以不可預測的方式去訪問一個緩衝區,那麼必須強制使用一致性DMA映射方式(在這裡我對不可預測的理解是,不能確定在何時它們訪問緩衝區),其他情況下,流式DMA映射方式更可取,因為在一些體系結構中處理一致性DMA映射是很麻煩的,並且可能導致更低的系統性能。
這裡詳細介紹流式DMA:
需要存取的緩衝區需要在資料傳送之前被映射(這裡的映射也就是需要呼叫一些函數告知內核,該緩衝區進行流式映射),在傳送之後被取消映射。
啟動一次串流DMA資料傳輸分為以下步驟:
#1. 分配DMA緩衝區。
在DMA裝置不採用S/G(分散/聚集)模式的情況下,必須保證緩衝區是物理上連續的,linux核心有兩個函數用來分配連續的記憶體:kmalloc()和__get_free_pages()。這兩個函數都有分配連續記憶體的最大值,kmalloc以分配位元組為單位,最大約為64KB,__get_free_pages()以分配頁為單位,最大能分配2^order數目的頁,order參數的最大值由include/linux/Mmzone.h檔案中的MAX_ORDER巨集決定(在預設的2.6.18核心版本中,巨集定義為10。也就是說在理論上__get_free_pages函數一次最多能申請1
#2. 建立串流映射。
在對DMA衝區進行讀寫存取之後,且在啟動DMA裝置傳輸之前,啟用dma_map_single()函數建立串流DMA映射,這兩個函數接受緩衝區的線性位址作為其參數並傳回對應的匯流排位址。
3. 釋放流式映射。
當DMA傳輸結束之後我們需要釋放該映射,這時呼叫dma_unmap_single()函數。
注意:
(1). 為了避免高速緩存一致性問題,驅動程式在開始從RAM到裝置的DMA資料傳輸之前,如果有必要,應該呼叫dma_sync_single_for_device( )函數刷新與DMA緩衝區對應的快取行。
(2). 從裝置到RAM的一次DMA資料傳送完成之前裝置驅動程式是不可以存取記憶體緩衝區的,但如果有必要的話,驅動程式在讀取緩衝區之前,應該呼叫dma_sync_single_for_cpu()函數使對應的硬體快取行無效。
(3).雖然kmalloc底層也是用__get_free_pages實現的,不過kmalloc對應的釋放緩衝區函數為kfree,而__get_free_pages對應的釋放緩衝區函數為free_pages。具體與__get_free_pages有關係的幾個申請與釋放函數如下:
申請函數:
alloc_pages(gfp_mask ,order)傳回第一個所指派頁框描述符的位址,或如果指派失敗則傳回NULL。__get_free_pages(gfp_mask,order)類似alloc_pages(),但它傳回第一個所指派頁的線性位址。如果需要取得線性位址對應的頁框號,那麼需要呼叫virt_to_page(addr)巨集產生線性位址。釋放函數:__free_pages(page,order)這裡主要強調page是要釋放緩衝區的線性首地址所在的頁框號free_pages (page,order)這個函數類似__free_pages(page,order),但是它接收的參數為要釋放的第一個頁框的線性位址addr
以上是有沒有DMA Windows驅動的原始碼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

解決上古捲軸IV:遺忘重新製作的崩潰問題 上古捲軸IV:遺忘重新製作,2025年4月22日發布,用於PS5,Xbox系列X/S和Windows,擁有令人驚嘆的視覺效果和改進的遊戲玩法。但是,有些球員會遇到

解決《Clair Obscur: Expedition 33》UE-Sandfall遊戲崩潰問題 《Clair Obscur: Expedition 33》發布後廣受玩家期待,但許多玩家在啟動遊戲時遇到UE-Sandfall崩潰並關閉的錯誤。本文提供三種解決方法,助您流暢遊戲。 方法一:更改啟動選項 更改Steam啟動選項可以調整遊戲性能和圖形設置。嘗試將啟動選項設置為“-dx11”。 步驟1:打開Steam庫,找到遊戲,右鍵點擊選擇“屬性”。 步驟2:在“常規”選項卡下,找到“啟動選項”部分,

Windows 11 22H2更新後的藍牙問題故障排除 更新到Windows 11 22H2後會遇到藍牙問題? 本指南提供了恢復您的藍牙功能的解決方案。 通話過程中的音頻輟學等問題(例如

Microsoft採用了系統更新周期,以保持Windows系統穩定且安全。週期的一個不可或缺的一部分是周二的補丁,其中microsof

解決《Clair Obscur: Expedition 33》PC版控制器失靈問題 您是否也遇到了《Clair Obscur: Expedition 33》PC版控制器無法正常工作的難題?別擔心,您並非孤例!本文將為您提供多種有效解決方法。 《Clair Obscur: Expedition 33》已登陸PlayStation 5、Windows和Xbox Series X/S平台。這款遊戲是一款引人入勝的回合製RPG,強調精準的時機把握。其獨特之處在於將策略性和快速反應完美融合。 流暢的操作對

“試圖分配紋理的視頻記憶重新製作的遺忘”錯誤是一個令人沮喪的問題,阻止玩家享受遊戲。本指南提供了解決此問題的直接解決方案。 可能發生此錯誤

在蒸汽安裝過程中遇到“目標文件夾必須為空”錯誤?這個常見的問題有一個簡單的修復。本指南提供了兩種解決方案,以啟動並運行蒸汽。 快速導航: 蒸汽安裝錯誤:目的地


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器