分享超过" 4Go - PAGE_SIZE"来自内核空间的缓冲区以及Windows内核驱动程序中的用户空间

时间:2016-01-29 12:05:13

标签: c++ driver windows-kernel

我目前正在玩Windows内核驱动程序,以便更好地了解Windows内部。作为玩具项目,我编写了一个内核驱动程序,其作用是分配可在进程之间共享的内存。

应用程序可以要求驱动程序创建任意大小的内存缓冲区。然后驱动程序使用 MmAllocatePagesForMdl 在KernelSpace中创建此缓冲区,然后在用户模式下使用 MmMapLockedPagesSpecifyCache 映射此缓冲区。结果指针返回给应用程序,它可以像在任何普通缓冲区中一样直接写入。然后另一个应用程序可以要求驱动程序访问该内存以便读取它(甚至写入);驱动程序只需在新进程的上下文中已经存在的缓冲区上调用 MmMapLockedPagesSpecifyCache 。到目前为止,一切都很好。

在这个小小的成功之后,我想在内核空间中创建一个更大的缓冲区,然后我就碰壁了。 MDL最多只能管理" 4Go - PAGE_SIZE"。

我的第一个想法是使用 MmAllocatePagesForMdl 创建几个MDL,直到我满足大小请求,使用 Next 指针链接MDL,然后将指针返回给用户空间使用 MmMapLockedPagesSpecifyCache 。但 MmMapLockedPagesSpecifyCache 不适用于链式MDL,它只在用户空间中映射第一个MDL。

到目前为止,我还没有找到一种方法从用户空间的内核空间返回超过4Go的连续虚拟内存。内核空间中的分配不是问题,因为我使用内存分页,因此物理内存不必是连续的,但我无法找到如何在连续虚拟内存中映射这些内容以在用户空间中使用。

我是贪婪的,这是不可能的吗?或者我错过了什么才能做到这一点?

有关信息,它只是64位驱动程序和64位应用程序,因此这里没有32位限制。

1 个答案:

答案 0 :(得分:1)

所以在到处寻找后,使用MDL是不可能的。要拥有超过4Go,我必须在我的驱动程序中创建一个部分。它相当于用户模式下的CreateFileMapping。但是我不想依赖于SharedMemory,因为我在内存分配/映射期间有一些锁定。

然后亚历克斯给了我一个关于osr forum的精彩建议,以解决我最初的问题;使用带有SEC_LARGE_PAGES选项的CreateFileMapping。内存锁已经消失了,我和我的驱动程序一样快,没有可能由这样的开发引起的所有问题。