特殊池

特殊池功能将 Windows 配置为在使用指定的池标记分配内存或在指定大小范围内分配内存时,从保留的内存池请求内存分配。

缩写

spp

十六进制值

(无)

符号名称

(无)

目标

系统范围的注册表项

(Windows Vista 及更高版本) 系统范围的注册表项、内核标志

选择池标记

为特定池标记请求特殊池时,请确保驱动程序或其他内核模式程序使用唯一的池标记。

此外,在创建池标记 ((例如使用 ExAllocatePoolWithTag) )时,请考虑按相反顺序输入标记字符。 例如,如果标记为 Fred,请考虑将其输入为 derF (0x64657246) 。 池标记存储在注册表中,并反向显示在调试器和其他工具中, (低端) 顺序。 如果按相反顺序输入它们,它们将按正向顺序显示 (0x46726564)

如果怀疑驱动程序正在使用所有特殊池,请考虑在代码中使用多个池标记。 然后,可以多次测试驱动程序,在每个测试中将特殊池分配给一个池标记。

此外,选择具有大于系统页面大小的十六进制值的池标记。 对于内核模式代码,如果输入值小于 PAGE_SIZE 的池标记,则 Gflags 会为大小在相应范围内的所有分配请求特殊池,并为具有等效池标记的分配请求特殊池。 例如,如果选择大小 为 30,则特殊池将用于大小介于 17 到 32 字节之间的所有分配,以及具有池标记0x0030的分配。

选择分配大小

使用以下准则为特殊池功能选择分配大小。

在具有 x86 处理器的计算机上,PAGE_SIZE 0x1000,分配大小范围长度为 8 个字节。 若要为此范围内大小的所有分配配置特殊池功能,请输入一个等于此范围最大值加 8 的数字。 (此数字始终是 8.) 下表说明了这些值:

大小范围 输入此数字

1 到 8 个字节

10 (十进制 16)

9 到 16 个字节

18 (十进制 24)

17 到 24 个字节

20 (十进制 32)

...

...

0xFE9到0xFF0字节

FF8 (decimal 4088)

在具有 AMD x86-64 处理器的计算机上,PAGE_SIZE 0x1000,分配大小范围长度为 16 字节。 若要为此范围内大小的所有分配配置特殊池功能,请输入一个等于此范围最大值加 16 的数字。 (此数字始终是 16.) 下表说明了这些值:

大小范围 输入此数字

1 到 16 个字节

20 (十进制 32)

17 到 32 个字节

30 (十进制 48)

33 到 48 字节

40 (十进制 64)

...

...

0xFD1到0xFE0字节

FF0 (十进制 4080)

在具有任何处理器的计算机上,可以使用星号 ( * ) 或0x2A (十进制 42) 为系统上的所有内存分配配置特殊池功能。

备注

有关在“全局标志”对话框中配置特殊池功能的信息,请参阅 配置特殊池。 有关在命令行上配置特殊池功能的信息,请参阅 GFlags 命令。 有关示例,请参阅 示例 14:配置特殊池

当使用指定的池标记分配内存或在指定大小范围内分配内存时,Gflags 的特殊池功能指示 Windows 从保留的内存池请求内存分配。 若要为特定驱动程序的所有分配请求特殊池,请使用驱动程序验证程序。 有关详细信息,请参阅 Windows 驱动程序工具包 (WDK) 的“驱动程序验证程序”部分中的“特殊池”主题。

Gflags 和驱动程序验证程序的特殊池功能可帮助你检测和识别内核池使用中的错误来源,例如超出分配的内存空间,或引用已释放的内存。

并非所有特殊池请求都得到满足。 来自特殊池的每个分配使用一页不可分页的物理内存和两页虚拟地址空间。 如果特殊池已用尽,则会从标准池分配内存,直到特殊池再次可用。 当从标准池填充特殊池请求时,请求函数将返回成功状态。 它不会返回错误,因为分配已成功,即使它不是从特殊池填充的。

特殊池的大小随着系统上的物理内存量而增加;理想情况下,这至少应为 1 GB (GB) 。 在 x86 计算机上,由于虚拟 (除了占用物理) 空间外,请勿在使用特殊池时使用 /3GB 启动选项。 最好将页面文件最小/最大数量增加 2 或 3 个因子。

还可以配置特殊池功能,使内存分配保持一致,以检测在分配 (“不足”) 之前对内存的引用,或者对内存的引用超出分配 (“溢出”) 。 此功能仅在所有版本的 Windows 上的“全局标志”对话框中可用。 有关详细信息,请参阅 检测溢出和不足

在 Windows Vista 及更高版本的 Windows 上,你可以将特殊池功能配置为需要重新启动的注册表设置,但在更改它之前仍然有效,或者配置为不需要重新启动,但仅在重新启动或关闭 Windows 之前才生效的内核标志设置。 在早期版本的 Windows 中,特殊池仅可用作注册表设置。

在 Windows Vista 及更高版本的 Windows 上,可以使用“全局标志”对话框或命令行配置特殊池功能。 在早期版本的 Windows 中,此功能仅在“全局标志”对话框中可用。