【问题标题】:Mapping Kernel-Space Virtual Address to User-Space Virtual Address in Windows 10 Driver在 Windows 10 驱动程序中将内核空间虚拟地址映射到用户空间虚拟地址
【发布时间】:2018-01-16 07:47:25
【问题描述】:

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

大概是这样的:

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

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

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

感谢您的宝贵时间!

【问题讨论】:

  • 为什么不让内核从一开始就使用用户空间缓冲区?
  • 据我了解,如果我在用户空间分配一个缓冲区,不能保证它在物理内存中是连续的(仅在当前进程的虚拟内存中),我需要向位于 PCIe 插槽上的设备显示地址,它可以从该地址开始连续写入。
  • 也许这会很有用:stackoverflow.com/questions/7089735/…,虽然表面上看起来只是在处理文件。
  • 让用户进程将用户空间 virtual 地址 [和长度] 提供给内核驱动程序。您的 驱动程序 可以/应该决定它是否可以绕过中间缓冲区[或不]。驱动程序可以暂停进程,锁定页面,确定 I/O 空间物理地址,并生成分散/收集 DMA 操作 [可能使用 I/O MMU]。关键是司机[可能]更适合处理这一切。您可以让用户进程请求驱动程序 [从连续内存] 进行缓冲区分配并将其传递回进程。
  • 如果你设法暴露它(不复制),你不会在单个内核空间上发生多进程冲突吗?

标签: c windows-10 driver memory-mapping kernel-mode


【解决方案1】:

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

【讨论】:

  • 请注意页面锁定,否则您的驱动程序将出现内存泄漏错误。由于某些驱动程序锁定了一半的 RAM,因此必须重新启动 Windows 总是很烦人。
猜你喜欢
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 2023-03-17
  • 2018-08-12
  • 2021-03-18
  • 1970-01-01
相关资源
最近更新 更多