使用DMA的直接IO

使用DMA的設備直接在用戶緩衝區上進行IO操作:

上圖說明了驅動怎樣使用IRP中的MdlAddress來傳輸數據,此操作爲讀數據過程。上圖中的驅動使用基於包的傳輸,bus-master模式或system模式都可以。

1、用戶空間虛擬地址的某一範圍,代表當前線程的緩衝區。緩衝區(虛擬地址空間)的內容實際上可能存儲於一些物理上離散的頁面中(如上圖中的陰影部分)。IO管理器創建一個MDL來描述緩衝區。MDL是一個不透明的數據結構,由內存管理器定義。MDL用於將某一特殊的虛擬地址範圍映射到一個或多個基於頁的物理地址範圍。

2、IO管理器爲當前線程的讀請求服務。線程傳入一個用戶空間地址範圍,此地址範圍代表了一個緩衝區。

3、IO管理器或FSDFile System Dispatch)檢查用戶適用的緩衝區是否可以訪問,並調用MmProbeAndLockPagesMmProbeAndLockPages適用之前創建的MDL作爲參數。MmProbeAndLockPages同時填滿MDL中相應的物理內存。

如上圖所示,表示虛擬地址的MDL可能有幾個基於頁的物理地址入口。緩衝區的虛擬空間範圍可能起始和結束於某些字節偏移,例如,從MDL描述的頁面中的第一頁起始部分和最後一頁起始部分。

4、IO管理器提供了一個MDL的指針,該指針存儲於發起傳輸操作請求的IRP中。在驅動完成IRP的請求,IO管理器或文件系統調用MmUnlockPages函數之前,MDL中描述的物理頁一直是鎖定的,並且分配給了緩衝區。MDL中的虛擬地址能變成不可見的,甚至在IRP被送到設備驅動(或位於設備驅動上層的中間驅動)之前。

5、如驅動使用基於包的systembus-master DMA,它的AdapterControl例程調用MmGetMdlVirtualAddressMmGetMdlVirtualAddress使用IRP中的MdlAddress指針作爲參數,以獲取MDL的基於頁的入口的虛擬地址基址。

6、AdapterControl例程調用MapTransfer,直接從設備中讀取數據到物理內存。MapTransfer使用MmGetMdlVirtualAddress返回的基地址作爲參數。

驅動必須時常檢查緩衝區的長度。IO管理器並不爲長度爲0的緩衝區創建MDL

 

(本文議自於MSDN,不明之處請參考原文Using Direct I/O with DMA)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章