0

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

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

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

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

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

那我是不是太贪心了,这是不可能的?还是我为了做到这一点而错过了什么?

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

4

1 回答 1

1

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

然后 Alex 在osr 论坛上给了我一个很好的建议,以解决我最初的问题;使用带有 SEC_LARGE_PAGES 选项的 CreateFileMapping。内存锁消失了,我的速度和我的驱动程序一样快,没有任何可能由这种开发引起的问题。

于 2016-02-05T16:46:28.727 回答