【发布时间】:2018-01-16 07:47:25
【问题描述】:
我正在 Windows 10(64 位)中编写内核模式驱动程序,其主要目的是从 DMA 读取,我想知道是否不是将内存块从内核空间复制到分配的缓冲区中用户空间,我可以以某种方式将地址暴露给用户空间(当然不是物理地址),并节省内存复制操作。
大概是这样的:
分配一块连续的物理内存(并将物理地址映射到内核空间中的虚拟地址)。
将内核空间中的虚拟地址映射到用户空间中的虚拟地址。
顺便说一句,由于只有一个内核空间,用户空间与系统中运行的进程一样多(对吗?),我将不得不对调用进程使用某种句柄,在为了在相应的进程中获取虚拟地址...
感谢您的宝贵时间!
【问题讨论】:
-
为什么不让内核从一开始就使用用户空间缓冲区?
-
据我了解,如果我在用户空间分配一个缓冲区,不能保证它在物理内存中是连续的(仅在当前进程的虚拟内存中),我需要向位于 PCIe 插槽上的设备显示地址,它可以从该地址开始连续写入。
-
也许这会很有用:stackoverflow.com/questions/7089735/…,虽然表面上看起来只是在处理文件。
-
让用户进程将用户空间 virtual 地址 [和长度] 提供给内核驱动程序。您的 驱动程序 可以/应该决定它是否可以绕过中间缓冲区[或不]。驱动程序可以暂停进程,锁定页面,确定 I/O 空间物理地址,并生成分散/收集 DMA 操作 [可能使用 I/O MMU]。关键是司机[可能]更适合处理这一切。您可以让用户进程请求驱动程序 [从连续内存] 进行缓冲区分配并将其传递回进程。
-
如果你设法暴露它(不复制),你不会在单个内核空间上发生多进程冲突吗?
标签: c windows-10 driver memory-mapping kernel-mode