有沒有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脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

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

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

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

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

Windows 11 KB5054979 更新:安裝指南及疑難解答 針對Windows 11 24H2版本,微軟已發布累積更新KB5054979,包含多項改進和錯誤修復。本文將指導您如何安裝此更新,並提供安裝失敗時的解決方法。 關於Windows 11 24H2 KB5054979 KB5054979於2025年3月27日發布,是針對Windows 11 24H2版本.NET Framework 3.5和4.8.1的安全更新。此更新增強了.NET Framework 3.5和4.8.1的安全性和

KB5053602補丁,於2025年3月11日發布,針對Windows 11版本22H2和23H2,將操作系統升級為OS構建22621.5039和22631.5039,

Windows 10 KB5053606 更新安裝失敗?這篇指南提供有效解決方法! 許多用戶在嘗試安裝微軟2025年3月補丁星期二發布的Windows 10 KB5053606更新時遇到問題,例如SSH連接中斷、Dwm.exe無響應或輸入法編輯器(IME)問題等。更新下載或安裝過程中可能卡住,或出現錯誤代碼,如0x800f0922、0xd0000034、0x80070437和0x80072efe等。 KB5053606安裝失敗通常由多種原因導致,包括Windows更新組件故障、系統文件損壞、磁盤

Microsoft Office中的“出問題了”錯誤TAG 7Q6CH在基本任務(例如創建文檔或處理電子郵件)中破壞您的工作流程

微軟於2025年3月11日更新,KB5053598,是Windows 11 24H2的關鍵補丁(OS Build 26100.3476)。 該Minitool指南涵蓋了您需要了解的所有內容,包括解決安裝問題。 KB5053598中有什麼新功能? 發行

Windows 11會定期更新,以增強安全性,修復錯誤並引入新功能。此更新過程的一個方面是補丁星期二,發生

GTA 5 Enhanced ERR_GFX_D3D_NOD3D12 錯誤修復指南 Grand Theft Auto V Enhanced (GTA 5 Enhanced) 是一款升級版遊戲,但部分玩家在啟動時遇到 “ERR_GFX_D3D_NOD3D12: 未找到 DirectX 12 適配器或運行庫” 錯誤。本文提供幾種解決方法。 錯誤原因: 此錯誤通常表示您的系統缺少 DirectX 12 運行庫或兼容的 DirectX 12 顯卡。 解決方法: 方法一:安裝 DirectX 運行庫 檢

掌握AI限制的保存文件位置和保護:綜合指南 計劃潛入動感十足的科幻RPG,AI限制,在2025年3月27日啟動? 了解您的保存文件位置並實施強大的保護方法是
