3

我正在 Windows 10(64 位)中编写内核模式驱动程序,其主要目的是从 DMA 读取,我想知道是否不是将内存块从内核空间复制到用户空间中分配的缓冲区,我可以以某种方式将地址暴露给用户空间(当然不是物理地址),并节省内存复制操作。

也许是这样的:

  1. 分配一块连续的物理内存(并将物理地址映射到内核空间中的虚拟地址)。

  2. 将内核空间中的虚拟地址映射到用户空间中的虚拟地址。

顺便说一句,由于只有一个内核空间,并且用户空间与系统中运行的进程一样多(对吗?),我必须使用某种句柄来调用进程,以便获得相应进程中的虚拟地址...

谢谢你的时间!

4

1 回答 1

1

对于您的 (2),使用 AccessMode = UserMode 的MmMapLockedPagesSpecifyCache()怎么样?请注意重要的警告,“例程返回在驱动程序运行的进程上下文中有效的用户地址”,因此您需要确保在执行时驱动程序正在用户模式应用程序的进程中运行映射,即在直接处理来自用户模式代码的调用的驱动程序代码中进行映射,例如DeviceIoControl()。另请注意,要使用此功能,您需要提供描述物理页面的 MDL,并且必须锁定这些页面。

于 2017-08-09T17:46:13.367 回答