2017-08-08 193 views
0

我在Windows 10(64位)中編寫了一個內核模式驅動程序,其主要目的是從DMA讀取,而且我想知道如果不是將內存塊從內核空間複製到用戶空間中分配的緩衝區,我可以以某種方式將地址暴露給用戶空間(當然不是物理地址),並保存在內存複製操作中。將內核空間虛擬地址映射到Windows 10驅動程序中的用戶空間虛擬地址

也許是這樣的:

  1. 分配的連續物理存儲器塊(和在內核空間映射物理地址和虛擬地址)。

  2. 將內核空間中的虛擬地址映射到用戶空間中的虛擬地址。

順便說一句,因爲,因爲在系統中運行的進程,只有一個內核空間,並儘可能多的用戶空間(是正確的嗎?),我將不得不使用某種手柄到呼叫過程中,爲了在相應的過程中獲得虛擬地址...

感謝您的時間!

+0

爲什麼不讓內核從一開始就使用用戶空間緩衝區? –

+0

據我所知,如果我在用戶空間分配一個緩衝區,不能保證它在物理內存中是連續的(僅在當前進程的虛擬內存中),而且我需要向設備顯示一個地址位於PCIe插槽上,可以從中開始連續寫入。 – Jones

+0

也許這將是有用的:https://stackoverflow.com/questions/7089735/does-zero-copy-exist-in-windows-osm,雖然表面上看起來像只是處理文件。 – yano

回答

0

對於你的(2),如何與AccessMode = UserMode的MmMapLockedPagesSpecifyCache()。請注意一個重要的警告,「該例程返回一個用戶地址,該地址在驅動程序正在運行的過程中是有效的」,因此您需要確保驅動程序在您執行用戶模式應用程序時運行該映射,即通過在直接處理來自用戶模式代碼的呼叫的驅動程序代碼中進行映射, DeviceIoControl的()。另請注意,要使用此功能,您需要提供描述物理頁面的MDL,並且必須鎖定這些頁面。

+0

並且要小心頁面鎖定,否則你的驅動程序會有內存泄漏錯誤。總是惱人的必須重新啓動Windows,因爲一些驅動程序已經鎖定了一半的RAM。 –