用户空间是从“堆(heap)”分配缓冲区的,内核中是从“池(pool)”中分配的。
用户空间的堆是属于进程的,而内核中的池则是全局的,属于整个系统。内核中池有两种:PagedPool,所占页面可以倒换的,NonPagedPool,所占页面是不可倒换的,每个页面都占着物理内存。
ntdll!_POOL_TYPE NonPagedPool = 0 PagedPool = 1 NonPagedPoolMustSucceed = 2 DontUseThisType = 3 NonPagedPoolCacheAligned = 4 PagedPoolCacheAligned = 5 NonPagedPoolCacheAlignedMustS = 6 MaxPoolType = 7 NonPagedPoolSession = 32 PagedPoolSession = 33 NonPagedPoolMustSucceedSession = 34 DontUseThisTypeSession = 35 NonPagedPoolCacheAlignedSession = 36 PagedPoolCacheAlignedSession = 37 NonPagedPoolCacheAlignedMustSSession = 38
Windows内核中定义了许多不同的池,但是实际使用的基本上就是NonPagedPool和PagedPool两种。系统空间中,需要分配缓冲区时可以使用ExAllocatePool()。