有沒有DMA Windows驅動的原始碼?
在《深入理解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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Windows更新是保持操作系統穩定,安全並與新軟件或硬件兼容的關鍵部分。他們是在常規b上發行的

對上古捲軸進行故障排除IV:遺忘重新製作發射和性能問題 遇到撞車事故,黑色屏幕或長期捲軸的加載問題IV:遺忘重新製作?本指南為常見技術問題提供了解決方案。

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

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

Windows 11 KB5055528 (2025年4月8日發布) 更新詳解及疑難解答 針對Windows 11 23H2用戶,微軟於2025年4月8日發布了KB5055528更新。本文將介紹此更新的改進之處,並提供安裝失敗時的解決方法。 KB5055528更新內容: 此更新為Windows 11 23H2用戶帶來了諸多改進和新功能: 文件資源管理器: 提升了文本縮放功能,並改進了文件打開/保存對話框和復制對話框的輔助功能。 設置頁面: 新增“頂部卡片”功能,可快速查看處理器、內存、存儲和G

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

微軟的Windows 10 Winre更新故障:錯誤0x80070643解釋了 一年多以後,微軟仍在努力解決Winre更新問題。 最近的Windows 10 KB5057589更新使該錯誤0x80070643點燃。 本文探討了

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