C Windows 10驱动程序中内核空间虚拟地址到用户空间虚拟地址的映射

C Windows 10驱动程序中内核空间虚拟地址到用户空间虚拟地址的映射,c,windows-10,driver,memory-mapping,kernel-mode,C,Windows 10,Driver,Memory Mapping,Kernel Mode,我正在Windows 10(64位)中编写一个内核模式驱动程序,其主要目的是从DMA读取数据,我想知道是否可以将内存块从内核空间复制到用户空间中分配的缓冲区,而不是以某种方式将地址公开到用户空间(当然不是物理地址),并在内存上保存复制操作 也许是这样的: 分配一块连续物理内存(并将物理地址映射到内核空间中的虚拟地址) 将内核空间中的虚拟地址映射到用户空间中的虚拟地址 顺便说一句,因为只有一个内核空间,而且系统中运行的进程的用户空间也一样多(对吗?),所以我必须对调用进程使用某种句柄,以便在适当的

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

也许是这样的:

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

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

  • 顺便说一句,因为只有一个内核空间,而且系统中运行的进程的用户空间也一样多(对吗?),所以我必须对调用进程使用某种句柄,以便在适当的进程中获得虚拟地址


    谢谢你的时间

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

    为什么不让内核从一开始就使用userspace buffer?据我所知,如果我在用户空间分配一个缓冲区,就不能保证它在物理内存中是连续的(仅在当前进程的虚拟内存中),我需要向PCIe插槽上的设备显示一个地址,从该地址可以开始连续写入。也许这会很有用:,尽管表面上看起来这只是在处理文件。让用户进程提供用户空间虚拟地址[和长度]到内核驱动程序。驱动程序可以/应该决定是否可以绕过中间缓冲区。驱动程序可以挂起进程,锁定页面,确定I/O空间物理地址,并生成分散/聚集DMA操作[可能使用I/O MMU]。关键是驱动程序[可能]更适合处理所有这一切。您可以让用户进程请求驱动程序[从连续内存]进行缓冲区分配,并将其传递回进程。如果您设法公开(不复制)单个内核空间,您不会在单个内核空间上发生多进程冲突吗?并小心页面锁定,否则您的驱动程序将出现内存泄漏错误。由于某些驱动程序锁定了一半的RAM,因此必须重新启动Windows总是很烦人。