在 windows 内核驱动程序中与用户 space 共享来自内核 space 的超过“4Go - PAGE_SIZE” 缓冲区

Sharing more than "4Go - PAGE_SIZE" buffer from kernel space with user space in a windows kernel driver

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

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

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

我的第一个想法是使用 MmAllocatePagesForMdl 创建多个 MDL,直到我满足大小请求,使用 Next 指针链接 MDL,然后 return 使用 MmMapLockedPagesSpecifyCache 指向用户 Space 的指针。但是 MmMapLockedPagesSpecifyCache 不适用于链式 MDL,它只映射用户 space 第一个 MDL。

到目前为止,我还没有找到在用户space中从内核space中return超过4Go的连续虚拟内存的方法。内核 Space 中的分配不是问题,因为我使用内存分页,因此物理内存不必是连续的,但我找不到如何将连续虚拟内存中的那些映射到用户 Space.

所以我是不是太贪心了,这是不可能的?还是我错过了什么才能做到这一点?

仅供参考,它是 64 位驱动程序和 64 位应用程序,因此此处没有 32 位限制。

所以到处找了下,用MDL是不行的。要拥有超过 4Go,我必须在我的驱动程序中创建部分。它相当于用户模式下的 CreateFileMapping。但是我不想依赖 SharedMemory,因为我在内存 allocation/mapping.

期间有一些锁

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